diff --git a/Cargo.toml b/Cargo.toml index 5a68df1..de214b6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["accumulator", "hintfile", "node"] +members = ["accumulator", "analysis", "hintfile", "node"] default-members = ["accumulator"] resolver = "2" diff --git a/analysis/Cargo.toml b/analysis/Cargo.toml new file mode 100644 index 0000000..604981f --- /dev/null +++ b/analysis/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "analysis" +version = "0.1.0" +edition = "2021" + +[dependencies] +csv = "1.4.0" +hintfile = { path = "../hintfile/" } diff --git a/analysis/src/main.rs b/analysis/src/main.rs new file mode 100644 index 0000000..32e0f0f --- /dev/null +++ b/analysis/src/main.rs @@ -0,0 +1,43 @@ +use std::fs::File; + +use hintfile::Hints; + +fn differentials(indexes: &[u64]) -> Vec { + indexes + .iter() + .zip(indexes.iter().skip(1)) + .map(|(a, b)| b - a) + .collect() +} + +fn average(diffs: &[u64]) -> f64 { + let sum = diffs.iter().sum::() as f64; + if !diffs.is_empty() { + return sum / diffs.len() as f64; + } + 0. +} + +fn main() { + let path = std::env::args() + .nth(1) + .expect("Usage: "); + let file = File::open(path).unwrap(); + let mut hints = Hints::from_file(file); + let csv = File::create("./results.csv").unwrap(); + let mut wtr = csv::Writer::from_writer(csv); + for height in 1..=hints.stop_height() { + let unspents = hints.get_indexes(height); + let max_unspent = unspents.iter().max().unwrap_or(&0); + let diffs = differentials(&unspents); + let average_diff = average(&diffs); + println!("Block height: {height}; average diff: {average_diff}; max index: {max_unspent}; diffs: {diffs:?}"); + wtr.write_record(vec![ + height.to_string(), + average_diff.to_string(), + max_unspent.to_string(), + ]) + .unwrap(); + // std::thread::sleep(Duration::from_millis(500)); + } +}