/// <summary> /// Invariant: algebra.IsSatisfiable(context), assumes that bag1 has no dead branches /// </summary> private IteBag <T> OpInContext(BagOpertion op, T context, IteBag <T> bag1, IteBag <T> bag2) { IteBag <T> bag; var key = new Tuple <BagOpertion, T, IteBag <T>, IteBag <T> >(op, context, bag1, bag2); if (opCache.TryGetValue(key, out bag)) { return(bag); } if (bag1.IsLeaf) { return(OpInContext2(op, context, bag1, bag2)); } var context1 = algebra.MkAnd(context, bag1.Predicate); var context2 = algebra.MkAnd(context, algebra.MkNot(bag1.Predicate)); var t = OpInContext(op, context1, bag1.TrueCase, bag2); var f = OpInContext(op, context2, bag1.FalseCase, bag2); bag = MkNode(bag1.Predicate, t, f); opCache[key] = bag; return(bag); }
internal IteBag <T> Op(BagOpertion op, IteBag <T> bag1, IteBag <T> bag2) { count[op] += 1; stopwatch[op].Start(); var res = OpInContext(op, algebra.True, bag1, bag2); stopwatch[op].Stop(); return(res); }
private int ApplyOp(BagOpertion op, int p1, int p2) { switch (op) { case BagOpertion.PLUS: return(p1 + p2); case BagOpertion.MINUS: return(Math.Max(0, p1 - p2)); case BagOpertion.SETMINUS: return(Math.Max(0, Math.Min(1, p1) - p2)); case BagOpertion.MIN: return(Math.Min(p1, p2)); case BagOpertion.MAX: return(Math.Max(p1, p2)); default: throw new AutomataException(AutomataExceptionKind.IteBagError); } }
private IteBag <T> OpInContext2(BagOpertion op, T context, IteBag <T> leaf, IteBag <T> bag2) { if (bag2.IsLeaf) { var newleaf = MkLeaf(ApplyOp(op, leaf.Count, bag2.Count)); return(newleaf); } IteBag <T> bag; var key = new Tuple <BagOpertion, T, IteBag <T>, IteBag <T> >(op, context, leaf, bag2); if (opCache.TryGetValue(key, out bag)) { return(bag); } var context_t = algebra.MkAnd(context, bag2.Predicate); if (algebra.IsSatisfiable(context_t)) { var context_f = algebra.MkAnd(context, algebra.MkNot(bag2.Predicate)); if (algebra.IsSatisfiable(context_f)) { bag = MkNode(bag2.Predicate, OpInContext2(op, context_t, leaf, bag2.TrueCase), OpInContext2(op, context_f, leaf, bag2.FalseCase)); } else //~IsSat(context & ~ bag2.Predicate) ---> IsValid(context ==> bag2.Predicate) { bag = OpInContext2(op, context, leaf, bag2.TrueCase); } } else //~IsSat(context & bag2.Predicate) ---> IsValid(context ==> ~ bag2.Predicate) { bag = OpInContext2(op, context, leaf, bag2.FalseCase); } opCache[key] = bag; return(bag); }
public long GetElapsedMilliseconds(BagOpertion op) { return(stopwatch[op].ElapsedMilliseconds); }
public int GetCallCount(BagOpertion op) { return(count[op]); }