#![warn(missing_docs)]
mod macros;
pub(crate) mod unionfind;
mod dot;
mod eclass;
mod egraph;
mod expr;
mod extract;
mod parse;
mod pattern;
mod rewrite;
mod run;
mod subst;
pub use dot::Dot;
pub use eclass::{EClass, Metadata};
pub use egraph::EGraph;
pub use expr::{ENode, Id, Language, RecExpr};
pub use extract::*;
pub use parse::ParseError;
pub use pattern::{Pattern, SearchMatches};
pub use rewrite::{Applier, Condition, ConditionEqual, ConditionalApplier, Rewrite, Searcher};
pub use run::*;
pub use subst::{Subst, Var};
#[cfg(test)]
fn init_logger() {
let _ = env_logger::builder().is_test(true).try_init();
}
#[doc(hidden)]
pub fn egg_bench<T>(name: &str, mut f: impl FnMut() -> T) -> T {
fn mean_stdev(data: &[f64]) -> (f64, f64) {
assert_ne!(data.len(), 0);
let sum = data.iter().sum::<f64>();
let n = data.len() as f64;
let mean = sum / n;
let variance = data
.iter()
.map(|value| {
let diff = mean - (*value as f64);
diff * diff
})
.sum::<f64>()
/ n;
(mean, variance.sqrt())
}
use std::env::{var, VarError};
use std::time::{Duration, Instant};
match var("EGG_BENCH") {
Err(VarError::NotPresent) => f(),
Ok(s) => {
let seconds = s.parse().unwrap();
let duration = Duration::from_secs_f64(seconds);
let start = Instant::now();
let mut times = vec![];
println!("benching {} for {} seconds...", name, seconds);
let result = loop {
let i = Instant::now();
let result = f();
times.push(i.elapsed().as_secs_f64());
if start.elapsed() > duration {
break result;
}
};
let (mean, stdev) = mean_stdev(×);
println!("bench {}:", name);
println!(" n = {}", times.len());
println!(" μ = {}", mean);
println!(" σ = {}", stdev);
result
}
_ => panic!(),
}
}