conjure_cp_core/rule_engine/
rewrite_morph.rs

1use itertools::Itertools;
2use tree_morph::{helpers::select_panic, prelude::*};
3
4use crate::{Model, bug};
5
6use super::{RuleSet, get_rules_grouped};
7
8/// Call the "optimized", tree-morph rewriter.
9pub fn rewrite_morph<'a>(
10    mut model: Model,
11    rule_sets: &Vec<&'a RuleSet<'a>>,
12    prop_multiple_equally_applicable: bool,
13) -> Model {
14    let submodel = model.as_submodel_mut();
15    let rules_grouped = get_rules_grouped(rule_sets)
16        .unwrap_or_else(|_| bug!("get_rule_priorities() failed!"))
17        .into_iter()
18        .map(|(_, rule)| rule.into_iter().map(|f| f.rule).collect_vec())
19        .collect_vec();
20    let selector = if prop_multiple_equally_applicable {
21        select_panic
22    } else {
23        select_first
24    };
25
26    let engine = EngineBuilder::new()
27        .set_selector(selector)
28        .append_rule_groups(rules_grouped)
29        .build();
30    let (expr, symbol_table) = engine.morph(submodel.root().clone(), submodel.symbols().clone());
31
32    *submodel.symbols_mut() = symbol_table;
33    submodel.replace_root(expr);
34    model
35}