@Test public final void testAcyclic() { bounds.bound(ac1, factory.area(factory.tuple("0", "0"), factory.tuple("4", "4"))); assertNotNull(solve(ac1.some().and(ac1.acyclic()))); assertPrimVarNum(10); bounds.bound(r1, factory.range(factory.tuple("0"), factory.tuple("4"))); assertNotNull(solve(ac1.join(r1).some().and(ac1.acyclic()))); assertPrimVarNum(10 + bounds.upperBound(r1).size()); TupleSet ac2b = factory.setOf("5", "6", "7", "8"); ac2b = ac2b.product(ac2b); bounds.bound(ac2, ac2b); assertNotNull(solve(ac1.difference(ac2).some().and(ac1.acyclic()).and(ac2.acyclic()))); assertPrimVarNum(10 + 6); bounds.boundExactly(r2, factory.setOf(factory.tuple("5", "6"))); assertNotNull(solve(ac2.join(r2).some().and(ac2.acyclic()))); final TupleSet ac3Bound = factory.allOf(2); ac3Bound.remove(factory.tuple("9", "9")); bounds.bound(ac3, ac3Bound); assertNotNull( solve(ac1.difference(ac2).union(ac3).some().and(ac1.acyclic()).and(ac2.acyclic()))); assertPrimVarNum(ac3Bound.size() + 10 + 6); bounds.bound(to3, factory.allOf(2)); bounds.bound(ord3, factory.setOf("0", "1", "2")); bounds.bound(first3, bounds.upperBound(ord3)); bounds.bound(last3, bounds.upperBound(ord3)); assertNotNull( solve(to3.product(ac1).some().and(ac1.acyclic()).and(to3.totalOrder(ord3, first3, last3)))); assertPrimVarNum(bounds.upperBound(ac1).size()); }
@Test public final void testTotalOrdering() { bounds.bound(to1, factory.area(factory.tuple("0", "0"), factory.tuple("4", "4"))); bounds.bound(ord1, factory.setOf("0", "1", "2", "3", "4")); bounds.bound(first1, bounds.upperBound(ord1)); bounds.bound(last1, bounds.upperBound(ord1)); final Formula ordered1 = to1.totalOrder(ord1, first1, last1); assertNotNull(solve(to1.some().and(ordered1))); assertPrimVarNum(0); assertAuxVarNum(0); assertClauseNum(0); bounds.bound(r1, factory.range(factory.tuple("0"), factory.tuple("4"))); assertNotNull(solve(to1.join(r1).some().and(ordered1))); assertPrimVarNum(bounds.upperBound(r1).size()); bounds.boundExactly(r1, bounds.upperBound(r1)); assertNotNull(solve(to1.join(r1).some().and(ordered1))); assertPrimVarNum(0); bounds.bound(to2, factory.setOf("5", "6", "7", "8", "9").product(factory.setOf("5", "7", "8"))); bounds.bound(ord2, factory.setOf("5", "7", "8")); bounds.bound(first2, bounds.upperBound(ord2)); bounds.bound(last2, bounds.upperBound(ord2)); final Formula ordered2 = to2.totalOrder(ord2, first2, last2); assertNotNull(solve(to1.difference(to2).some().and(ordered2).and(ordered1))); assertPrimVarNum(0); assertAuxVarNum(0); assertClauseNum(0); bounds.bound(to3, factory.allOf(2)); bounds.bound(ord3, factory.allOf(1)); bounds.bound(first3, factory.setOf("9")); bounds.bound(last3, factory.setOf("8")); final Formula ordered3 = to3.totalOrder(ord3, first3, last3); assertNotNull(solve(to3.product(to1).some().and(ordered1).and(ordered3))); assertPrimVarNum(bounds.upperBound(to3).size() + bounds.upperBound(ord3).size() + 2); // SAT solver takes a while // bounds.boundExactly(r2, factory.setOf(factory.tuple("9","8"))); // assertNotNull(solve(r2.in(to3).and(ordered3))); bounds.bound(to3, factory.allOf(2)); bounds.bound(ord3, factory.setOf("3")); bounds.bound(first3, factory.allOf(1)); bounds.bound(last3, factory.allOf(1)); Instance instance = solve(ordered3); assertNotNull(instance); assertTrue(instance.tuples(to3).isEmpty()); assertTrue(instance.tuples(ord3).equals(bounds.upperBound(ord3))); assertTrue(instance.tuples(first3).equals(bounds.upperBound(ord3))); assertTrue(instance.tuples(last3).equals(bounds.upperBound(ord3))); }
/** * Returns the bounds for the given scope. * * @return the bounds for the given scope. */ public final Bounds bounds(int scope) { assert scope > 0; final int n = scope * 3; final List<String> atoms = new ArrayList<String>(n); for (int i = 0; i < scope; i++) atoms.add("Object" + i); for (int i = 0; i < scope; i++) atoms.add("Name" + i); for (int i = 0; i < scope; i++) atoms.add("DirEntry" + i); final Universe u = new Universe(atoms); final TupleFactory f = u.factory(); final Bounds b = new Bounds(u); final int max = scope - 1; b.bound(Obj, f.range(f.tuple("Object0"), f.tuple("Object" + max))); b.boundExactly(Root, f.setOf("Object0")); b.bound(Cur, b.upperBound(Obj)); b.bound(File, b.upperBound(Obj)); b.bound(Dir, b.upperBound(Obj)); b.bound(Name, f.range(f.tuple("Name0"), f.tuple("Name" + max))); b.bound(DirEntry, f.range(f.tuple("DirEntry0"), f.tuple("DirEntry" + max))); b.bound(entries, b.upperBound(Dir).product(b.upperBound(DirEntry))); b.bound(parent, b.upperBound(Dir).product(b.upperBound(Dir))); b.bound(name, b.upperBound(DirEntry).product(b.upperBound(Name))); b.bound(contents, b.upperBound(DirEntry).product(b.upperBound(Obj))); return b; }