(vec: &[f64])
| 87 | } |
| 88 | |
| 89 | pub fn standardize_log_form_vec(vec: &[f64]) -> Vec<f64> { |
| 90 | // Filter out non-finite values for statistics calculation |
| 91 | let finite_values: Vec<f64> = vec.iter().filter(|x| x.is_finite()).copied().collect(); |
| 92 | |
| 93 | let n = finite_values.len() as f64; |
| 94 | if n <= 1.0 { |
| 95 | // If we have too few finite values, return zeros |
| 96 | println!( |
| 97 | "DEBUG: Too few finite values ({}) for standardization, returning zeros", |
| 98 | n |
| 99 | ); |
| 100 | return vec![0.0; vec.len()]; |
| 101 | } |
| 102 | |
| 103 | let mu: f64 = finite_values.iter().sum::<f64>() / n; |
| 104 | let sigma = (finite_values.iter().map(|x| (x - mu).powi(2)).sum::<f64>() / (n - 1.0)).sqrt(); |
| 105 | |
| 106 | // Debug the standardization process |
| 107 | let finite_count = vec.iter().filter(|x| x.is_finite()).count(); |
| 108 | let nan_count = vec.iter().filter(|x| x.is_nan()).count(); |
| 109 | let inf_count = vec.iter().filter(|x| x.is_infinite()).count(); |
| 110 | println!( |
| 111 | "DEBUG Standardization: n={}, mu={:.6}, sigma={:.6}, finite={}, nan={}, inf={}", |
| 112 | vec.len(), |
| 113 | mu, |
| 114 | sigma, |
| 115 | finite_count, |
| 116 | nan_count, |
| 117 | inf_count |
| 118 | ); |
| 119 | |
| 120 | if !sigma.is_finite() || sigma == 0.0 { |
| 121 | println!("DEBUG: Sigma is problematic, returning zeros"); |
| 122 | return vec![0.0; vec.len()]; |
| 123 | } |
| 124 | |
| 125 | // Standardize all values, but only finite ones get proper standardization |
| 126 | vec.iter() |
| 127 | .map(|&x| { |
| 128 | if x.is_finite() { |
| 129 | standardize_log(x, mu, sigma) |
| 130 | } else { |
| 131 | 0.0 // Non-finite values get zero standardized score |
| 132 | } |
| 133 | }) |
| 134 | .collect() |
| 135 | } |
| 136 | |
| 137 | #[allow(dead_code)] |
| 138 | fn normalize_per_bin( |
no test coverage detected