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