use clap::Parser;
use csv::Reader;
use std::error::Error;
use mathbox::stats::estimator::pcc;
#[derive(Parser, Debug)]
#[clap(name = "decompose")]
#[clap(author = "Freedeaths")]
#[clap(version = "0.1")]
#[clap(about = "Decompose a time series signal", long_about = None)]
struct Cli {
#[clap(short, long)]
file: String,
}
fn main() -> Result<(), Box<dyn Error>> {
let cli = Cli::parse();
let mut rdr = Reader::from_path(cli.file.as_str())?;
let obj = rdr
.records()
.map(|r| r.unwrap().get(3).unwrap().parse::<f64>().unwrap())
.collect::<Vec<_>>();
let mut top_candidate: Vec<(isize, f64)> = vec![];
let num = 45; for i in 0..num {
rdr = Reader::from_path(cli.file.as_str())?; let candidate = rdr
.records()
.map(|r| r.unwrap().get(i).unwrap().parse::<f64>().unwrap())
.collect::<Vec<_>>();
let res = pcc(&obj, &candidate, 20).iter().fold((0, 0.0), |max, x| {
if x.1 > max.1 {
(x.0, x.1)
} else {
max
}
});
top_candidate.push(res);
}
let mut result: Vec<(usize, (isize, f64))> = vec![];
top_candidate.iter().enumerate().map(|(i, x)| result.push((i, *x))).count();
result.sort_by(|a, b| a.1 .1.partial_cmp(&b.1 .1).unwrap());
result.reverse();
println!("{:?}", result);
Ok(())
}