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.
Trait Implementations§
Auto Trait Implementations§
impl<'a, CF, L, N> RefUnwindSafe for Extractor<'a, CF, L, N>where CF: RefUnwindSafe, L: RefUnwindSafe, N: RefUnwindSafe, <CF as CostFunction<L>>::Cost: RefUnwindSafe, <N as Analysis<L>>::Data: RefUnwindSafe, <L as DiscriminantKind>::Discriminant: RefUnwindSafe,
impl<'a, CF, L, N> Send for Extractor<'a, CF, L, N>where CF: Send, L: Send + Sync, N: Sync, <CF as CostFunction<L>>::Cost: Send, <N as Analysis<L>>::Data: Sync,
impl<'a, CF, L, N> Sync for Extractor<'a, CF, L, N>where CF: Sync, L: Sync, N: Sync, <CF as CostFunction<L>>::Cost: Sync, <N as Analysis<L>>::Data: Sync,
impl<'a, CF, L, N> Unpin for Extractor<'a, CF, L, N>where CF: Unpin, L: Unpin, <CF as CostFunction<L>>::Cost: Unpin,
impl<'a, CF, L, N> UnwindSafe for Extractor<'a, CF, L, N>where CF: UnwindSafe, L: UnwindSafe + RefUnwindSafe, N: RefUnwindSafe, <CF as CostFunction<L>>::Cost: UnwindSafe, <N as Analysis<L>>::Data: RefUnwindSafe, <L as DiscriminantKind>::Discriminant: RefUnwindSafe,
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more