Skip to content
Snippets Groups Projects
Commit f0917eb5 authored by Sebastian Krings's avatar Sebastian Krings
Browse files

throw exception if second solution of non-incremental solver is requested

parent 00d8a057
No related branches found
No related tags found
No related merge requests found
...@@ -198,7 +198,7 @@ public final class ImmutableProblem { ...@@ -198,7 +198,7 @@ public final class ImmutableProblem {
logger.info(bounds.toString()); logger.info(bounds.toString());
} }
return new Request(variables, Arrays.asList(sol).iterator()); return new Request(variables, new NonIncrementalSolverSolutionIterator(sol));
} }
} }
......
package de.stups.probkodkod;
import java.util.Iterator;
import kodkod.engine.Solution;
public class NonIncrementalSolverSolutionIterator implements Iterator<Solution> {
private Solution sol;
private boolean returned = false;
public NonIncrementalSolverSolutionIterator(Solution sol) {
this.sol = sol;
}
@Override
public boolean hasNext() {
return true;
}
@Override
public Solution next() {
if (!returned) {
return sol;
}
throw new RuntimeException("second solution of non-incremental solver requested");
}
}
...@@ -7,14 +7,13 @@ import java.util.Map; ...@@ -7,14 +7,13 @@ import java.util.Map;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import de.prob.prolog.output.IPrologTermOutput;
import de.stups.probkodkod.types.TupleType;
import kodkod.ast.Relation; import kodkod.ast.Relation;
import kodkod.engine.Solution; import kodkod.engine.Solution;
import kodkod.engine.Statistics;
import kodkod.instance.Instance; import kodkod.instance.Instance;
import kodkod.instance.Tuple; import kodkod.instance.Tuple;
import kodkod.instance.TupleSet; import kodkod.instance.TupleSet;
import de.prob.prolog.output.IPrologTermOutput;
import de.stups.probkodkod.types.TupleType;
/** /**
* A request stores the information about a ongoing query in the current * A request stores the information about a ongoing query in the current
...@@ -29,13 +28,11 @@ public final class Request { ...@@ -29,13 +28,11 @@ public final class Request {
private final RelationInfo[] variables; private final RelationInfo[] variables;
private final Iterator<Solution> iterator; private final Iterator<Solution> iterator;
public Request(final RelationInfo[] variables, public Request(final RelationInfo[] variables, final Iterator<Solution> iterator) {
final Iterator<Solution> iterator) {
this.variables = variables; this.variables = variables;
this.iterator = iterator; this.iterator = iterator;
if (logger.isLoggable(Level.FINE)) { if (logger.isLoggable(Level.FINE)) {
logger.fine("request created: return variables are: " logger.fine("request created: return variables are: " + Arrays.asList(variables));
+ Arrays.asList(variables));
} }
} }
...@@ -95,8 +92,7 @@ public final class Request { ...@@ -95,8 +92,7 @@ public final class Request {
pto.closeTerm(); pto.closeTerm();
pto.fullstop(); pto.fullstop();
if (logger.isLoggable(Level.FINE)) { if (logger.isLoggable(Level.FINE)) {
logger.fine("wrote " + num + " solutions, computed in " logger.fine("wrote " + num + " solutions, computed in " + duration + "ms");
+ duration + "ms");
} }
return solutionsPresent; return solutionsPresent;
} catch (RuntimeException ex) { } catch (RuntimeException ex) {
...@@ -106,6 +102,11 @@ public final class Request { ...@@ -106,6 +102,11 @@ public final class Request {
pto.fullstop(); pto.fullstop();
return true; return true;
} }
if ("second solution of non-incremental solver requested".equals(ex.getMessage())) {
pto.printAtom("sat_non_incremental");
pto.fullstop();
return true;
}
throw (ex); throw (ex);
} }
} }
...@@ -117,14 +118,12 @@ public final class Request { ...@@ -117,14 +118,12 @@ public final class Request {
pto.openList(); pto.openList();
for (int i = 0; i < variables.length; i++) { for (int i = 0; i < variables.length; i++) {
final RelationInfo relinfo = variables[i]; final RelationInfo relinfo = variables[i];
final TupleSet tupleSet = instance.tuples(relinfo final TupleSet tupleSet = instance.tuples(relinfo.getRelation());
.getRelation());
final TupleType tupleType = relinfo.getTupleType(); final TupleType tupleType = relinfo.getTupleType();
pto.openTerm(tupleType.isSingleton() ? "b" : "s"); pto.openTerm(tupleType.isSingleton() ? "b" : "s");
pto.printAtom(relinfo.getId()); pto.printAtom(relinfo.getId());
if (tupleType.isSingleton()) { if (tupleType.isSingleton()) {
final Tuple tuple = tupleSet.isEmpty() ? null final Tuple tuple = tupleSet.isEmpty() ? null : tupleSet.iterator().next();
: tupleSet.iterator().next();
writeTuple(pto, tupleType, tupleSet, tuple); writeTuple(pto, tupleType, tupleSet, tuple);
} else { } else {
pto.openList(); pto.openList();
...@@ -139,15 +138,13 @@ public final class Request { ...@@ -139,15 +138,13 @@ public final class Request {
pto.closeList(); pto.closeList();
} }
private void writeTupleSet(final IPrologTermOutput pto, private void writeTupleSet(final IPrologTermOutput pto, final TupleType tupleType, final TupleSet tupleSet) {
final TupleType tupleType, final TupleSet tupleSet) {
for (Tuple tuple : tupleSet) { for (Tuple tuple : tupleSet) {
writeTuple(pto, tupleType, tupleSet, tuple); writeTuple(pto, tupleType, tupleSet, tuple);
} }
} }
private void writeTuple(final IPrologTermOutput pto, private void writeTuple(final IPrologTermOutput pto, final TupleType tupleType, final TupleSet tupleSet,
final TupleType tupleType, final TupleSet tupleSet,
final Tuple tuple) { final Tuple tuple) {
final int[] intTuple = tupleType.decodeTuple(tuple, tupleSet); final int[] intTuple = tupleType.decodeTuple(tuple, tupleSet);
pto.openList(); pto.openList();
...@@ -163,20 +160,19 @@ public final class Request { ...@@ -163,20 +160,19 @@ public final class Request {
Solution solution = iterator.next(); Solution solution = iterator.next();
instance = solution.instance(); instance = solution.instance();
if (logger.isLoggable(Level.FINE)) { if (logger.isLoggable(Level.FINE)) {
logger.fine("CNF translated in " + solution.stats().translationTime() logger.fine("CNF translated in " + solution.stats().translationTime() + " ms and solved in "
+ " ms and solved in " + solution.stats().solvingTime() + "ms (" + solution.stats().solvingTime() + "ms (" + solution.stats().clauses() + " clauses, "
+ solution.stats().clauses() + " clauses, " + solution.stats().variables() + " variables, " + solution.stats().primaryVariables()
+ solution.stats().variables() + " variables, " + " primary variables)");
+ solution.stats().primaryVariables() + " primary variables)");
} }
/* TO DO: maybe add a preference for this: */ /* TO DO: maybe add a preference for this: */
/* the information is printed on the output stream and then /*
read by ProB in get_solutions_from_stream in kodkod_process.pl */ * the information is printed on the output stream and then read by
System.out.println("stats(" + solution.stats().translationTime() + * ProB in get_solutions_from_stream in kodkod_process.pl
"," + solution.stats().solvingTime() + */
"," + solution.stats().clauses() + System.out.println("stats(" + solution.stats().translationTime() + "," + solution.stats().solvingTime()
"," + solution.stats().variables() + + "," + solution.stats().clauses() + "," + solution.stats().variables() + ","
"," + solution.stats().primaryVariables() + "). "); + solution.stats().primaryVariables() + "). ");
} else { } else {
instance = null; instance = null;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment