public void BottomUpRewriter_NumToArith_Partial_FallbackUnconditional() { var logger = new StringWriter(); var burw = new BottomUpRewriter <NumExpr, NumNodeType, ArithExpr, NumWildcardFactory> { // Leaf nodes Leaves = { { (Val c) => new Const(c.Value), 1 }, }, // Tree patterns Rules = { { (l, r) => new Plus(l, r), (l, r) => new Add(l, r), 2 }, { (a, b, c) => new TimesPlus(a, b, c), (a, b, c) => new Add(new Mul(a, b), c), 2}, { x => new Inc(x), x => new Add(x, new Const(1)), 2 }, }, // Fallback rules Fallbacks = { { n => new Lazy(() => n.Eval()), 1 }, }, Log = logger }; // Internal tables var debugView = burw.DebugView; Assert.IsTrue(!string.IsNullOrEmpty(debugView)); var e = new TimesPlus( new Inc( new Times( new Val(2), new Val(3) ) ), new Times( new Val(4), new Val(5) ), new Val(6) ); var res = burw.Rewrite(e); Assert.IsTrue(res.ToString().Contains("Lazy")); Assert.AreEqual(e.Eval(), res.Eval()); }
public void BottomUpRewriter_NumToArith_Partial_FallbackWithPredicate() { var logger = new StringWriter(); var burw = new BottomUpRewriter <NumExpr, NumNodeType, ArithExpr, NumWildcardFactory> { // Leaf nodes Leaves = { { (Val c) => new Const(c.Value), 1 }, }, // Tree patterns Rules = { { (l, r) => new Plus(l, r), (l, r) => new Add(l, r), 2 }, { (a, b, c) => new TimesPlus(a, b, c), (a, b, c) => new Add(new Mul(a, b), c), 2}, { x => new Inc(x), x => new Add(x, new Const(1)), 2 }, }, // Fallback rules Fallbacks = { { n => new Const(((Times)n).Let(t => t.Left.Eval() * t.Right.Eval())), n => n.Value == NumNodeType.Times, 1 }, }, Log = logger }; // Internal tables var debugView = burw.DebugView; Assert.IsTrue(!string.IsNullOrEmpty(debugView)); var e = new TimesPlus( new Inc( new Times( new Val(2), new Val(3) ) ), new Times( new Val(4), new Val(5) ), new Val(6) ); var res = burw.Rewrite(e); Assert.AreEqual("Add(Mul(Add(Const(6), Const(1)), Const(20)), Const(6))", res.ToString()); Assert.AreEqual(e.Eval(), res.Eval()); }
public void BottomUpRewriter_NumToArith_Partial_Irreducible() { var logger = new StringWriter(); var burw = new BottomUpRewriter <NumExpr, NumNodeType, ArithExpr, NumWildcardFactory> { // Leaf nodes Leaves = { { (Val c) => new Const(c.Value), 1 }, }, // Tree patterns Rules = { { (l, r) => new Plus(l, r), (l, r) => new Add(l, r), 2 }, { (a, b, c) => new TimesPlus(a, b, c), (a, b, c) => new Add(new Mul(a, b), c), 2}, { x => new Inc(x), x => new Add(x, new Const(1)), 2 }, }, Log = logger }; // Internal tables var debugView = burw.DebugView; Assert.IsTrue(!string.IsNullOrEmpty(debugView)); var e = new TimesPlus( new Inc( new Times( new Val(2), new Val(3) ) ), new Times( new Val(4), new Val(5) ), new Val(6) ); Assert.ThrowsException <InvalidOperationException>(() => burw.Rewrite(e)); }