#[derive(Default)]
pub struct DfsStats {
pub closed: u64,
pub intersected: u64,
pub too_far: u64,
pub shadow_skip: u64,
pub recursed: u64,
pub canonical_skip: u64,
pub modular_skip: u64,
pub closure_table_skip: u64,
}
impl DfsStats {
pub fn total(&self) -> u64 {
self.closed
+ self.intersected
+ self.too_far
+ self.shadow_skip
+ self.recursed
+ self.canonical_skip
+ self.modular_skip
+ self.closure_table_skip
}
pub fn merge(&mut self, other: &DfsStats) {
self.closed += other.closed;
self.intersected += other.intersected;
self.too_far += other.too_far;
self.shadow_skip += other.shadow_skip;
self.recursed += other.recursed;
self.canonical_skip += other.canonical_skip;
self.modular_skip += other.modular_skip;
self.closure_table_skip += other.closure_table_skip;
}
}
impl std::fmt::Display for DfsStats {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let t = self.total();
let pct = |n: u64| 100.0 * n as f64 / t as f64;
writeln!(f, "DFS stats ({} total direction attempts):", t)?;
writeln!(
f,
" canonical_skip: {:>10} ({:>5.1}%)",
self.canonical_skip,
pct(self.canonical_skip)
)?;
writeln!(
f,
" intersected: {:>10} ({:>5.1}%)",
self.intersected,
pct(self.intersected)
)?;
writeln!(
f,
" closed: {:>10} ({:>5.1}%)",
self.closed,
pct(self.closed)
)?;
writeln!(
f,
" recursed: {:>10} ({:>5.1}%)",
self.recursed,
pct(self.recursed)
)?;
writeln!(
f,
" too_far: {:>10} ({:>5.1}%)",
self.too_far,
pct(self.too_far)
)?;
writeln!(
f,
" shadow_skip: {:>10} ({:>5.1}%)",
self.shadow_skip,
pct(self.shadow_skip)
)?;
writeln!(
f,
" modular_skip: {:>10} ({:>5.1}%)",
self.modular_skip,
pct(self.modular_skip)
)?;
write!(
f,
" closure_table_skip: {:>10} ({:>5.1}%)",
self.closure_table_skip,
pct(self.closure_table_skip)
)
}
}