diff options
Diffstat (limited to 'src/maxmin.rs')
-rw-r--r-- | src/maxmin.rs | 58 |
1 files changed, 50 insertions, 8 deletions
diff --git a/src/maxmin.rs b/src/maxmin.rs index 6bea2d7..df4a0f5 100644 --- a/src/maxmin.rs +++ b/src/maxmin.rs @@ -1,6 +1,16 @@ use std::cmp::Ordering; -pub fn normalize(data: &mut Vec<f64>) { +pub fn clamp(data: &mut [f64], lower: f64, upper: f64) { + if data.is_empty() { + return; + } + + for x in data.iter_mut() { + *x = f64::min(upper, f64::max(lower, *x)); + } +} + +pub fn normalize(data: &mut [f64]) { if data.is_empty() { return; } @@ -18,8 +28,8 @@ pub fn normalize(data: &mut Vec<f64>) { } } -pub fn smooth(data: &mut Vec<f64>, sigma: f64) { - const WINDOW_SIZE: usize = 7; +pub fn smooth(data: &mut [f64], sigma: f64) { + const WINDOW_SIZE: usize = 5; if data.is_empty() { return; @@ -40,7 +50,7 @@ pub fn smooth(data: &mut Vec<f64>, sigma: f64) { // Smooth data let first = data.first().unwrap(); - let mut buffer = [*first; WINDOW_SIZE]; + let mut buffer = [f64::NAN; WINDOW_SIZE]; let mut bi = 0; for (_loc, x) in data.iter_mut().enumerate() { buffer[bi] = *x; @@ -52,8 +62,8 @@ pub fn smooth(data: &mut Vec<f64>, sigma: f64) { } } -pub fn derive(data: &mut Vec<f64>) { - const WINDOW_SIZE: usize = 3; +pub fn derive(data: &mut [f64]) { + const WINDOW_SIZE: usize = 5; if data.is_empty() { return; @@ -61,12 +71,12 @@ pub fn derive(data: &mut Vec<f64>) { // Calculate the derivative. let first = data.first().unwrap(); - let mut buffer = [*first; WINDOW_SIZE]; + let mut buffer = [f64::NAN; WINDOW_SIZE]; let mut bi = 0; for (_loc, x) in data.iter_mut().enumerate() { buffer[bi] = *x; *x = (buffer[bi] - buffer[(bi + WINDOW_SIZE - 1) % (WINDOW_SIZE)]) - / (WINDOW_SIZE as f64 - 1.0); + / (WINDOW_SIZE as f64); bi = (bi + 1) % WINDOW_SIZE; } } @@ -142,4 +152,36 @@ mod tests { assert!((0.667 - x[2]).abs() < 0.001); assert!((1.0 - x[3]).abs() < 0.001); } + + + #[test] + fn first_run() { + + + // let mut values = [37200000.0, 13323636.0, 10937.16, 12403.11, 12771.62, 12771.62, 13511.11, 13140.96]; + let mut values = [13323636.0, 10937.16, 12403.11, 12771.62, 12771.62, 13511.11, 13140.96]; + for (i, x) in values.iter().enumerate() { + println!("original: {} => {:?}", i, x); + } + super::normalize(&mut values); + for (i, x) in values.iter().enumerate() { + println!("normalize: {} => {:?}", i, x); + } + // super::smooth(&mut values, 1.0); + // for (i, x) in values.iter().enumerate() { + // println!("smooth: {} => {:?}", i, x); + // } + super::derive(&mut values); + for (i, x) in values.iter().enumerate() { + println!("derive: {} => {:?}", i, x); + } + let extrema = super::find_extrema(&values); + + + for x in extrema { + println!("{:?}", x); + } + + assert!(false); + } } |