use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RegressionConfig {
pub significance_level: f64,
pub min_sample_size: usize,
pub enable_noise_filtering: bool,
pub noise_threshold: f64,
}
impl Default for RegressionConfig {
fn default() -> Self {
Self {
significance_level: 0.05, min_sample_size: 5, enable_noise_filtering: true, noise_threshold: 0.5, }
}
}
impl RegressionConfig {
pub fn strict() -> Self {
Self {
significance_level: 0.01, min_sample_size: 10,
enable_noise_filtering: true,
noise_threshold: 0.3, }
}
pub fn permissive() -> Self {
Self {
significance_level: 0.10, min_sample_size: 3,
enable_noise_filtering: true,
noise_threshold: 1.0, }
}
pub fn validate(&self) -> Result<(), String> {
if !(0.0..=1.0).contains(&self.significance_level) {
return Err(format!(
"significance_level must be in [0, 1], got {}",
self.significance_level
));
}
if self.min_sample_size < 2 {
return Err(format!(
"min_sample_size must be >= 2 for t-test, got {}",
self.min_sample_size
));
}
if self.noise_threshold < 0.0 {
return Err(format!(
"noise_threshold must be non-negative, got {}",
self.noise_threshold
));
}
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_config() {
let config = RegressionConfig::default();
assert_eq!(config.significance_level, 0.05);
assert_eq!(config.min_sample_size, 5);
assert!(config.enable_noise_filtering);
assert_eq!(config.noise_threshold, 0.5);
assert!(config.validate().is_ok());
}
#[test]
fn test_strict_config() {
let config = RegressionConfig::strict();
assert_eq!(config.significance_level, 0.01);
assert_eq!(config.min_sample_size, 10);
assert_eq!(config.noise_threshold, 0.3);
assert!(config.validate().is_ok());
}
#[test]
fn test_permissive_config() {
let config = RegressionConfig::permissive();
assert_eq!(config.significance_level, 0.10);
assert_eq!(config.min_sample_size, 3);
assert_eq!(config.noise_threshold, 1.0);
assert!(config.validate().is_ok());
}
#[test]
#[allow(clippy::field_reassign_with_default)]
fn test_invalid_significance_level() {
let mut config = RegressionConfig::default();
config.significance_level = 1.5;
assert!(config.validate().is_err());
}
#[test]
#[allow(clippy::field_reassign_with_default)]
fn test_invalid_min_sample_size() {
let mut config = RegressionConfig::default();
config.min_sample_size = 1;
assert!(config.validate().is_err());
}
#[test]
#[allow(clippy::field_reassign_with_default)]
fn test_invalid_noise_threshold() {
let mut config = RegressionConfig::default();
config.noise_threshold = -0.5;
assert!(config.validate().is_err());
}
}