pub struct Extractor<'a, CF: CostFunction<L>, L: Language, N: Analysis<L>> { /* private fields */ }
Expand description
Extracting a single RecExpr
from an EGraph
.
use egg::*;
define_language! {
enum SimpleLanguage {
Num(i32),
"+" = Add([Id; 2]),
"*" = Mul([Id; 2]),
}
}
let rules: &[Rewrite<SimpleLanguage, ()>] = &[
rewrite!("commute-add"; "(+ ?a ?b)" => "(+ ?b ?a)"),
rewrite!("commute-mul"; "(* ?a ?b)" => "(* ?b ?a)"),
rewrite!("add-0"; "(+ ?a 0)" => "?a"),
rewrite!("mul-0"; "(* ?a 0)" => "0"),
rewrite!("mul-1"; "(* ?a 1)" => "?a"),
];
let start = "(+ 0 (* 1 10))".parse().unwrap();
let runner = Runner::default().with_expr(&start).run(rules);
let (egraph, root) = (runner.egraph, runner.roots[0]);
let mut extractor = Extractor::new(&egraph, AstSize);
let (best_cost, best) = extractor.find_best(root);
assert_eq!(best_cost, 1);
assert_eq!(best, "10".parse().unwrap());
Implementations§
source§impl<'a, CF, L, N> Extractor<'a, CF, L, N>where
CF: CostFunction<L>,
L: Language,
N: Analysis<L>,
impl<'a, CF, L, N> Extractor<'a, CF, L, N>where
CF: CostFunction<L>,
L: Language,
N: Analysis<L>,
sourcepub fn new(egraph: &'a EGraph<L, N>, cost_function: CF) -> Self
pub fn new(egraph: &'a EGraph<L, N>, cost_function: CF) -> Self
Create a new Extractor
given an EGraph
and a
CostFunction
.
The extraction does all the work on creation, so this function performs the greedy search for cheapest representative of each eclass.
sourcepub fn find_best(&self, eclass: Id) -> (CF::Cost, RecExpr<L>)
pub fn find_best(&self, eclass: Id) -> (CF::Cost, RecExpr<L>)
Find the cheapest (lowest cost) represented RecExpr
in the
given eclass.
sourcepub fn find_best_node(&self, eclass: Id) -> &L
pub fn find_best_node(&self, eclass: Id) -> &L
Find the cheapest e-node in the given e-class.
sourcepub fn find_best_cost(&self, eclass: Id) -> CF::Cost
pub fn find_best_cost(&self, eclass: Id) -> CF::Cost
Find the cost of the term that would be extracted from this e-class.