1use std::env::args;
2use std::fs::read_to_string;
3use std::time::{Duration, Instant};
4use fermentation::ForwardDecay;
5use fermentation::g::Exponential;
6use fermentation::space_saving::BTreeSpaceSaving;
7
8fn main() {
9 let path = args().skip(1).next().expect("must pass an input file");
10 let contents = read_to_string(path.as_str()).expect("unable to open file");
11 let start = Instant::now();
12 let decay = ForwardDecay::new(start, Exponential::rate(0.001, Duration::from_secs(60)));
13 let mut ss = BTreeSpaceSaving::new(8, decay);
14
15 let mut hits = 0;
16
17 for e in contents.split_whitespace() {
18 hits += 1;
19 ss.hit(e);
20 }
21
22 let top = ss.top(2).expect("unable to guarantee top hitters");
23 let frequent = ss.frequent(0.1);
24 let end = Instant::now();
25
26 println!("Elapse: {}", (end - start).as_secs_f64());
27 println!("Top elements: {:?}", &top);
28
29 for (index, e) in top.into_iter().enumerate() {
30 println!("Element {index} is {} with {:?}", e, ss.get(e, end));
31 }
32
33 println!("Frequent elements: {:?}", frequent);
34 println!("Total hits: {}, Decayed hits: {}", hits, ss.hits(end));
35}