diff --git a/lib/kodkod.jar b/lib/kodkod.jar index bc62d19b83389d58c5efb96c760b5333577be78f..80a4756f6d00f8bdfcb4da62936b1ed84772303d 100644 Binary files a/lib/kodkod.jar and b/lib/kodkod.jar differ diff --git a/src/de/stups/probkodkod/KodkodAnalysis.java b/src/de/stups/probkodkod/KodkodAnalysis.java index ae124657026e13a7a1f87fbfc919441df39443da..11f3793293e18e8ed6b5bebb4b603600c5ef7d6d 100644 --- a/src/de/stups/probkodkod/KodkodAnalysis.java +++ b/src/de/stups/probkodkod/KodkodAnalysis.java @@ -89,7 +89,6 @@ import de.stups.probkodkod.parser.node.APrjInnerexpression; import de.stups.probkodkod.parser.node.AProblem; import de.stups.probkodkod.parser.node.AProductExprMultop; import de.stups.probkodkod.parser.node.AQuantInnerformula; -import de.stups.probkodkod.parser.node.AReflclsExprUnop; import de.stups.probkodkod.parser.node.ARelInnerformula; import de.stups.probkodkod.parser.node.ARelation; import de.stups.probkodkod.parser.node.ARelrefInnerexpression; @@ -178,8 +177,6 @@ public class KodkodAnalysis extends DepthFirstAdapter { BINEXPROPS.put(AOverwriteExprBinop.class.getName(), ExprOperator.OVERRIDE); UNEXPROPS.put(AClosureExprUnop.class.getName(), ExprOperator.CLOSURE); - UNEXPROPS.put(AReflclsExprUnop.class.getName(), - ExprOperator.REFLEXIVE_CLOSURE); UNEXPROPS.put(ATransposeExprUnop.class.getName(), ExprOperator.TRANSPOSE); MULTIPLICITIES diff --git a/src/de/stups/probkodkod/Request.java b/src/de/stups/probkodkod/Request.java index 32f4bca4dedc95581790980cf9b81f6a0d9d9802..27a666c160a81b72f4c32df31d0308700d1c63c0 100644 --- a/src/de/stups/probkodkod/Request.java +++ b/src/de/stups/probkodkod/Request.java @@ -63,14 +63,46 @@ public final class Request { * have been send to the stream */ public boolean writeNextSolutions(final IPrologTermOutput pto, final int max) { - pto.openTerm("solutions"); - pto.openList(); boolean solutionsPresent = true; int num; + int size = 0; + long durations[] = new long[max]; + Instance[] solutions = new Instance[max]; for (num = 0; solutionsPresent & num < max; num++) { - Instance instance = nextInstance(); + final long start = System.currentTimeMillis(); + final Instance instance = nextInstance(); + durations[num] = System.currentTimeMillis() - start; solutionsPresent = instance != null; if (solutionsPresent) { + solutions[num] = instance; + size++; + } + } + + pto.openTerm("solutions"); + printInstances(solutions, pto); + + pto.printAtom(solutionsPresent ? "more" : "all"); + pto.openList(); + long duration = 0; + for (int i = 0; i < size; i++) { + pto.printNumber(durations[i]); + duration += durations[i]; + } + pto.closeList(); + pto.closeTerm(); + pto.fullstop(); + if (logger.isLoggable(Level.FINE)) { + logger.fine("wrote " + num + " solutions, computed in " + duration + + "ms"); + } + return solutionsPresent; + } + + private void printInstances(Instance[] solutions, IPrologTermOutput pto) { + pto.openList(); + for (final Instance instance : solutions) { + if (instance != null) { pto.openList(); for (int i = 0; i < variables.length; i++) { final RelationInfo relinfo = variables[i]; @@ -94,13 +126,6 @@ public final class Request { } } pto.closeList(); - pto.printAtom(solutionsPresent ? "more" : "all"); - if (logger.isLoggable(Level.FINE)) { - logger.fine("wrote " + num + " solutions"); - } - pto.closeTerm(); - pto.fullstop(); - return solutionsPresent; } private void writeTupleSet(final IPrologTermOutput pto, diff --git a/src/problem.grammar b/src/problem.grammar index a0fd3ee5f1a6e9b8331330ad09a005ee49a3974d..d32d2959a6867009fcc49249f4752162ac42597b 100644 --- a/src/problem.grammar +++ b/src/problem.grammar @@ -49,7 +49,6 @@ Tokens keyword_overwrite = 'overwrite'; keyword_transpose = 'transpose'; keyword_closure = 'closure'; - keyword_reflexive_closure = 'reflexive_closure'; keyword_comprehension = 'comp'; keyword_empty = 'empty'; keyword_iden = 'iden'; @@ -186,8 +185,7 @@ Productions expr_unop = {transpose} keyword_transpose - | {closure} keyword_closure - | {reflcls} keyword_reflexive_closure; + | {closure} keyword_closure; intexpression = parenl innerintexpression parenr; innerintexpression = diff --git a/test/de/stups/probkodkod/InteractionTestBase.java b/test/de/stups/probkodkod/InteractionTestBase.java index 1d7ec5ed006753d0f70dc9f7ba51f7716e10a604..561ef428dfe15709c4f1decc25101ed7bd23b251 100644 --- a/test/de/stups/probkodkod/InteractionTestBase.java +++ b/test/de/stups/probkodkod/InteractionTestBase.java @@ -116,7 +116,7 @@ public class InteractionTestBase { throws IOException, ParserException, LexerException { CompoundPrologTerm solsterm = (CompoundPrologTerm) answer; assertEquals("solutions", solsterm.getFunctor()); - assertEquals(2, solsterm.getArity()); + assertEquals(3, solsterm.getArity()); ListPrologTerm listterm = (ListPrologTerm) solsterm.getArgument(1); for (PrologTerm bindings : listterm) { ListPrologTerm solterm = (ListPrologTerm) bindings; @@ -129,6 +129,8 @@ public class InteractionTestBase { } else { assertEquals(new CompoundPrologTerm("all"), moreTerm); } + ListPrologTerm durterm = (ListPrologTerm) solsterm.getArgument(3); + assertEquals("number of durations", listterm.size(), durterm.size()); } private SortedMap<String, Result> extractSolution( diff --git a/test/de/stups/probkodkod/KodkodTest.java b/test/de/stups/probkodkod/KodkodTest.java index 95d2521f2f4f4db9c87f6ac6d31188a36df7129c..87b12f0f58cce3a7af49287d4c454c0007895a16 100644 --- a/test/de/stups/probkodkod/KodkodTest.java +++ b/test/de/stups/probkodkod/KodkodTest.java @@ -5,6 +5,7 @@ import static org.junit.Assert.assertTrue; import java.io.IOException; import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.SortedMap; import org.junit.Test; @@ -175,4 +176,29 @@ public class KodkodTest extends InteractionTestBase { checkSolutions(b.toCollection(), sol); } + @Test + public void testSendMoreMoney() throws ParserException, LexerException, + IOException { + final String problem = load("sendmoremoney.kodkod"); + sendMessage(problem + "."); + sendMessage("request sendmoremoney 100 pos ()."); + List<SortedMap<String, Result>> sol = new LinkedList<SortedMap<String, Result>>(); + getSolutions(false, sol); + + ResultSetBuilder b = new ResultSetBuilder(); + b.single("s", t(9)); + b.single("e", t(5)); + b.single("n", t(6)); + b.single("d", t(7)); + b.single("m", t(1)); + b.single("o", t(0)); + b.single("r", t(8)); + b.single("y", t(2)); + b.store(); + checkSolutions(b.toCollection(), sol); + + for (final Map<String, Result> entry : sol) { + + } + } } diff --git a/test/de/stups/probkodkod/problems/sendmoremoney.kodkod b/test/de/stups/probkodkod/problems/sendmoremoney.kodkod new file mode 100644 index 0000000000000000000000000000000000000000..775f4fdc7b9eb1183883ac16f62ddecbc9e41c47 --- /dev/null +++ b/test/de/stups/probkodkod/problems/sendmoremoney.kodkod @@ -0,0 +1,63 @@ +problem sendmoremoney ((inttype(p2i 0 199980))) + +( (s singleton subset p2i) + (e singleton subset p2i) + (n singleton subset p2i) + (d singleton subset p2i) + (m singleton subset p2i) + (o singleton subset p2i) + (r singleton subset p2i) + (y singleton subset p2i)) + +(and (gt(expr2int(relref s))(0)) + (gt(expr2int(relref m))(0)) + (not(equals(relref s)(relref e))) + (not(equals(relref s)(relref n))) + (not(equals(relref s)(relref d))) + (not(equals(relref s)(relref m))) + (not(equals(relref s)(relref o))) + (not(equals(relref s)(relref r))) + (not(equals(relref s)(relref y))) + (not(equals(relref e)(relref n))) + (not(equals(relref e)(relref d))) + (not(equals(relref e)(relref m))) + (not(equals(relref e)(relref o))) + (not(equals(relref e)(relref r))) + (not(equals(relref e)(relref y))) + (not(equals(relref n)(relref d))) + (not(equals(relref n)(relref m))) + (not(equals(relref n)(relref o))) + (not(equals(relref n)(relref r))) + (not(equals(relref n)(relref y))) + (not(equals(relref d)(relref m))) + (not(equals(relref d)(relref o))) + (not(equals(relref d)(relref r))) + (not(equals(relref d)(relref y))) + (not(equals(relref m)(relref o))) + (not(equals(relref m)(relref r))) + (not(equals(relref m)(relref y))) + (not(equals(relref o)(relref r))) + (not(equals(relref o)(relref y))) + (not(equals(relref r)(relref y))) + (lte(1)(expr2int(relref s))) (lte(expr2int(relref s))(9)) + (lte(0)(expr2int(relref e))) (lte(expr2int(relref e))(9)) + (lte(0)(expr2int(relref n))) (lte(expr2int(relref n))(9)) + (lte(0)(expr2int(relref d))) (lte(expr2int(relref d))(9)) + (lte(1)(expr2int(relref m))) (lte(expr2int(relref m))(9)) + (lte(0)(expr2int(relref o))) (lte(expr2int(relref o))(9)) + (lte(0)(expr2int(relref r))) (lte(expr2int(relref r))(9)) + (lte(0)(expr2int(relref y))) (lte(expr2int(relref y))(9)) + (equals(add(add(add(add(add(add(add(mul(expr2int(relref s))(1000)) + (mul(expr2int(relref e))(100))) + (mul(expr2int(relref n))(10))) + (expr2int(relref d))) + (mul(expr2int(relref m))(1000))) + (mul(expr2int(relref o))(100))) + (mul(expr2int(relref r))(10))) + (expr2int(relref e))) + (add(add(add(add(mul(expr2int(relref m))(10000)) + (mul(expr2int(relref o))(1000))) + (mul(expr2int(relref n))(100))) + (mul(expr2int(relref e))(10))) + (expr2int(relref y))))) +