Nicer visualizations

This commit is contained in:
Sarah Jamie Lewis 2021-02-03 14:46:52 -08:00
parent e681e35054
commit 794266980c
1 changed files with 45 additions and 4 deletions

View File

@ -1,6 +1,7 @@
// todo would be neat to just make this a subscriber of the tracing log, but there doesn't
// seem to be a nice way for that API to do what we want.. so until then...
use hashbrown::HashMap;
use rand::{thread_rng, Rng};
use std::fs::File;
use std::io::Write;
@ -46,12 +47,12 @@ impl Oracle {
write!(output, "digraph {{\n");
write!(
output,
r#"K=2.5;
r#"K=2;
repulsiveforce=0.1;
overlap=true;
splines = true;
dpi=400;
penwidth = 0.8;
penwidth = 1;
"#
);
@ -62,15 +63,55 @@ impl Oracle {
writeln!(output, "\"{}\" [shape=point, color=\"#{:x}{:x}{:x}\"]", party, r, g, b);
}
let mut real_connection_map: HashMap<(String, String), u64> = HashMap::new();
let mut entangled_connection_map: HashMap<(String, String), u64> = HashMap::new();
let mut max_conn = 1;
for event in self.actual_events.iter() {
writeln!(output, "\"{}\" -> \"{}\" [arrowhead=none]", event.sender, event.intended_receiver);
let key = (event.sender.clone(), event.intended_receiver.clone());
if real_connection_map.contains_key(&key) {
*real_connection_map.get_mut(&key).unwrap() += 1;
if real_connection_map[&key] > max_conn {
max_conn = real_connection_map[&key];
}
} else {
real_connection_map.insert(key, 1);
}
match &event.entangled_receiver {
Some(entangled_receiver) => {
writeln!(output, "\"{}\" -> \"{}\" [arrowhead=none,style=dashed]", event.sender, entangled_receiver);
let key = (event.sender.clone(), entangled_receiver.clone());
if entangled_connection_map.contains_key(&key) {
*entangled_connection_map.get_mut(&key).unwrap() += 1;
if entangled_connection_map[&key] > max_conn {
max_conn = entangled_connection_map[&key];
}
} else {
entangled_connection_map.insert(key, 1);
}
}
_ => {}
};
}
for ((sender, receiver), size) in real_connection_map.iter() {
let normalized = (*size as f64 / max_conn as f64);
let transparency = (normalized * 255.0) as u8;
let penwidth = (normalized * 2.0) as f64;
writeln!(
output,
"\"{}\" -> \"{}\" [arrowhead=none, penwidth={}, color=\"#000000{:x}\"]",
sender, receiver, penwidth, transparency
);
}
for ((sender, receiver), size) in entangled_connection_map.iter() {
let normalized = (*size as f64 / max_conn as f64);
let transparency = (normalized * 255.0) as u8;
let penwidth = (normalized * 2.0) as f64;
writeln!(
output,
"\"{}\" -> \"{}\" [arrowhead=none, style=dashed, penwidth={}, color=\"#000000{:x}\"]",
sender, receiver, penwidth, transparency
);
}
write!(output, "}}");
}
}