use std::collections::HashMap; use std::path::PathBuf; use clap::Arg; use clap::App; use std::{env,fs}; fn main() { let res = match App::new("edge_compare") .version("0.1.0") .author("Alwin Berger") .about("Compare Serialized Edge-Maps.") .arg( Arg::new("a") .short('a') .long("map-a") .required(true) .takes_value(true), ) .arg( Arg::new("b") .short('b') .long("map-b") .required(true) .takes_value(true), ) .try_get_matches_from(env::args()) { Ok(res) => res, Err(err) => { println!( "Syntax: {}, --map-a --map-b \n{:?}", env::current_exe() .unwrap_or_else(|_| "fuzzer".into()) .to_string_lossy(), err.info, ); return; } }; let path_a = PathBuf::from(res.value_of("a").unwrap().to_string()); let path_b = PathBuf::from(res.value_of("b").unwrap().to_string()); let raw_a = fs::read(path_a).expect("Can not read dumped edges a"); let hmap_a : HashMap<(u64,u64),u64> = ron::from_str(&String::from_utf8_lossy(&raw_a)).expect("Can not parse HashMap"); let raw_b = fs::read(path_b).expect("Can not read dumped edges b"); let hmap_b : HashMap<(u64,u64),u64> = ron::from_str(&String::from_utf8_lossy(&raw_b)).expect("Can not parse HashMap"); let mut a_and_b = Vec::<((u64,u64),u64)>::new(); let mut a_and_b_differ = Vec::<((u64,u64),(u64,u64))>::new(); let mut a_sans_b = Vec::<((u64,u64),u64)>::new(); for i_a in hmap_a.clone() { match hmap_b.get(&i_a.0) { None => a_sans_b.push(i_a), Some(x) => if i_a.1 == *x { a_and_b.push(i_a); } else { a_and_b_differ.push((i_a.0,(i_a.1,*x))); } } } let b_sans_a : Vec<((u64,u64),u64)> = hmap_b.into_iter().filter(|x| !hmap_a.contains_key(&x.0) ).collect(); println!("a_sans_b: {:#?}\na_and_b_differ: {:#?}\nb_sans_a: {:#?}",&a_sans_b,&a_and_b_differ,&b_sans_a); println!("Stats: a\\b: {} a&=b: {} a&!=b: {} b\\a: {} avb: {} jaccarde: {}", a_sans_b.len(),a_and_b.len(),a_and_b_differ.len(),b_sans_a.len(), a_and_b.len()+a_and_b_differ.len()+a_sans_b.len()+b_sans_a.len(), (a_and_b.len()+a_and_b_differ.len())as f64/(a_and_b.len()+a_and_b_differ.len()+a_sans_b.len()+b_sans_a.len()) as f64); }