1use linreg::{linear_regression};
2
3pub mod utils;
4
5use utils::*;
6
7pub fn rssimple(x: Vec<f64>) -> f64 {
9 let n: f64 = x.len() as f64;
10 let x_mean: f64 = mean(&x);
11 let y: Vec<f64> = x.iter()
12 .map(|x| x - x_mean)
13 .collect();
14 let s: Vec<f64> = cumsum(&y);
15 let (min, max) = minmax(&s);
16 let rs: f64 = (max - min)/ standard_deviation(&x);
17 return rs.log2() / n.log2();
18}
19
20pub fn rs_corrected(x: Vec<f64>) -> f64 {
22 let mut cap_x: Vec<f64> = vec![x.len() as f64];
23 let mut cap_y: Vec<f64> = vec![rscalc(&x)];
24 let mut n: Vec<u64> = vec![0, x.len() as u64 / 2, x.len() as u64];
25 while n[1] >= 8 {
27 let mut xl: Vec<f64> = vec![];
28 let mut yl: Vec<f64> = vec![];
29 for i in 1..n.len() {
30 let rs: f64 = rscalc(&x[((n[i-1]+1) as usize)..(n[i] as usize)]);
31 xl.push((n[i]-n[i-1]) as f64);
32 yl.push(rs);
33 }
34 cap_x.push(mean(&xl));
35 cap_y.push(mean(&yl));
36 n = half(&n, x.len() as u64);
38 }
39 let cap_x_log: Vec<f64> = cap_x.iter().map(|a| a.ln()).collect();
41 let cap_y_log: Vec<f64> = cap_y.iter().map(|a| a.ln()).collect();
42 let (slope, _): (f64, f64) = linear_regression(&cap_x_log, &cap_y_log).unwrap();
43 return slope;
44}