-
Notifications
You must be signed in to change notification settings - Fork 14
Open
Description
Hello, I am trying to enumerate these terms using Enumo.
// ruler/tests/recipes/vec.rs
use ruler::{
enumo::{Filter, Metric, Ruleset, Workload},
recipe_utils::{recursive_rules, run_workload, Lang,iter_metric},
Limits,
};
use crate::Pred;
fn iter_grammar(n: usize) -> Workload {
let lang = Workload::new([
"EXPR",
]);
let EXPR : &[&str] = &[
"(vec_d EXPR)",
"(vec_s EXPR)",
"vals"
];
iter_metric(lang, "EXPR", Metric::Depth, n)
.plug("EXPR", &EXPR.into())
.plug("vals", &Workload::new(&["val_0", "val_1", "val_2"]))
}
pub fn vec_rules() -> Ruleset<Pred> {
println!("Generating vec rules!");
let mut all = Ruleset::default();
let canon = iter_grammar(3);
let get_rules = run_workload(
canon,
all.clone(),
Limits::synthesis(),
Limits::minimize(),
true
);
all.extend(get_rules);
all
}// ruler/tests/vec.rs
use num::{ToPrimitive, Zero};
use ruler::*;
use z3::ast::Ast;
type Constant = i64;
egg::define_language!{
pub enum Pred {
BVLit(Constant),
"vec_d" = vec_d(Id),
"vec_s" = vec_s(Id),
Var(Symbol),
}
}
impl SynthLanguage for Pred {
type Constant = Constant;
fn eval<'a, F>(&'a self, cvec_len: usize, mut get_cvec: F) -> CVec<Self>
where
F: FnMut(&'a Id) -> &'a CVec<Self>,
{
match self {
Pred::BVLit(v0) => {
println!("Interpreting BVlit");
vec![Some(v0.clone()); cvec_len]
}
Pred::vec_d(x) => {
println!("interpreting vec_d");
map!(get_cvec, x =>
Some(x.clone())
)
}
Pred::vec_s(x) => {
println!("interpreting vec_s");
map!(get_cvec, x =>
Some(x.clone())
)
}
Pred::Var(_) => vec![],
}
}
fn initialize_vars(egraph: &mut EGraph<Self, SynthAnalysis>, vars: &[String]) {
let consts = vec![
Some(1.to_i64().unwrap()),
];
let cvecs = self_product(&consts, vars.len());
egraph.analysis.cvec_len = cvecs[0].len();
for (i, v) in vars.iter().enumerate() {
let id = egraph.add(Pred::Var(Symbol::from(v.clone())));
let cvec = cvecs[i].clone();
egraph[id].data.cvec = cvec;
}
}
fn to_var(&self) -> Option<Symbol> {
if let Pred::Var(sym) = self {
Some(*sym)
} else {
None
}
}
fn mk_var(sym: Symbol) -> Self {
Pred::Var(sym)
}
fn is_constant(&self) -> bool {
matches!(self, Pred::BVLit(_))
}
fn mk_constant(c: Self::Constant, _egraph: &mut EGraph<Self, SynthAnalysis>) -> Self {
Pred::BVLit(c)
}
fn validate(lhs: &Pattern<Self>, rhs: &Pattern<Self>) -> ValidationResult {
let lexpr = egg_to_external_prog(Self::instantiate(lhs).as_ref());
let rexpr = egg_to_external_prog(Self::instantiate(rhs).as_ref());
println!("LEFT EXPRESSION");
println!("{}",lexpr);
println!("RIGHT EXPRESSION");
println!("{}",rexpr);
ValidationResult::Invalid
}
}
fn egg_to_external_prog<'a>(expr: &[Pred]) -> String {
let mut buf: Vec<String> = vec![];
for node in expr.as_ref().iter() {
match node {
Pred::BVLit(v0) => {
//buf.push("(lits)".to_string())
buf.push(format!("{}", v0))
}
Pred::Var(v0) => {
//buf.push("(vars)".to_string())
buf.push(format!("{}", v0))
}
Pred::vec_d(x) => {buf.push(format!("(vec_d_dsl {})", &buf[usize::from(*x)]))},
Pred::vec_s(x) => {buf.push(format!("(vec_s_dsl {})", &buf[usize::from(*x)]))},
}
}
buf.pop().unwrap()
}
#[cfg(test)]
#[path = "./recipes/vec.rs"]
mod vec;
mod test {
use crate::vec::vec_rules;
use crate::Pred;
use std::time::{Duration, Instant};
use ruler::{
enumo::{Filter, Metric, Ruleset, Workload},
logger,
recipe_utils::{recursive_rules, run_workload, Lang},
Limits,
};
#[test]
fn run() {
// Skip this test in github actions
if std::env::var("CI").is_ok() && std::env::var("SKIP_RECIPES").is_ok() {
return;
}
let start = Instant::now();
// Runs the actual search
let all_rules = vec_rules();
let duration = start.elapsed();
}
}
The validation function is returning Invalid for now since I need to call an external program containing the semantics to validate it instead of encoding it in Z3. However, on running the test, the terms don't enumerate to the specified depth.
Generating vec rules!
interpreting vec_d
interpreting vec_s
LEFT EXPRESSION
(vec_d_dsl a)
RIGHT EXPRESSION
a
LEFT EXPRESSION
a
RIGHT EXPRESSION
(vec_d_dsl a)
LEFT EXPRESSION
a
RIGHT EXPRESSION
(vec_d_dsl a)
LEFT EXPRESSION
(vec_s_dsl a)
RIGHT EXPRESSION
a
LEFT EXPRESSION
a
RIGHT EXPRESSION
(vec_s_dsl a)
LEFT EXPRESSION
a
RIGHT EXPRESSION
(vec_s_dsl a)
LEFT EXPRESSION
(vec_d_dsl a)
RIGHT EXPRESSION
(vec_s_dsl a)
LEFT EXPRESSION
(vec_s_dsl a)
RIGHT EXPRESSION
(vec_d_dsl a)
LEFT EXPRESSION
(vec_s_dsl a)
RIGHT EXPRESSION
(vec_d_dsl a)
We are trying to generate the rule (vec_d_dsl (vec_s_dsl a)) = a. Can you point to any reasons as to why that pattern is not being enumerated?
Metadata
Metadata
Assignees
Labels
No labels