use rand::Rng; use std::fs::OpenOptions; use std::io::prelude::*; fn main() { let mut file = OpenOptions::new() .write(true) .append(true) .open("./examples/stress_log.csv") .unwrap(); let mut rng = rand::thread_rng(); let runs = 10_000_000; for i in 0..runs { if i % 1_000 == 0 { let percent = 100 * i / runs; println!("Processed {} out of {} ({} %)", i, runs, percent); } let gain: f64 = rng.gen_range(0.0..100.0); let offset: f64 = rng.gen_range(0.0..100.0); let power: f64 = rng.gen_range(1.0..5.0); let base: f64 = rng.gen_range(0.0..100.0); let min_n = 1; let max_n = 100; type Func = Box f64>; let functions: Vec<(Func, big_o::Name)> = vec![ (Box::new(move |x| 0.0 * x + offset), big_o::Name::Constant), ( Box::new(move |x| gain * x.ln() + offset), big_o::Name::Logarithmic, ), (Box::new(move |x| gain * x + offset), big_o::Name::Linear), ( Box::new(move |x| gain * x * x.ln() + offset), big_o::Name::Linearithmic, ), ( Box::new(move |x| gain * x.powi(2) + offset), big_o::Name::Quadratic, ), ( Box::new(move |x| gain * x.powi(3) + offset), big_o::Name::Cubic, ), ( Box::new(move |x| gain * x.powf(power)), big_o::Name::Polynomial, ), ( Box::new(move |x| gain * base.powf(x)), big_o::Name::Exponential, ), ]; for (f, name) in functions { let data: Vec<(f64, f64)> = (min_n..max_n) .map(|i| i as f64) .map(|x| (x, f(x))) .collect(); let (complexity, _all) = big_o::infer_complexity(data).unwrap(); let (a, b) = match name { big_o::Name::Constant => (0.0, offset), big_o::Name::Polynomial => (gain, power), big_o::Name::Exponential => (gain, base), _ => (gain, offset), }; let is_ok = name == complexity.name; if !is_ok { let line = format!("{},{:?},{},{},{:?}", is_ok, name, a, b, complexity.name); if let Err(e) = writeln!(file, "{}", line) { eprintln!("Couldn't write to file: {}", e); } } } } }