X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=src%2Fcsolver.cc;h=1dfe9eb8ec9cf012f9af880c672e62a9ff95c81b;hb=34ba8a7da2ea48c2fc835985eee27bf2cd3e64db;hp=14f902b85e846c5f7c6e0a7e1bc76eb03705a9a3;hpb=3267d387309bb4d2aa130a940f386b419652a956;p=satune.git diff --git a/src/csolver.cc b/src/csolver.cc index 14f902b..1dfe9eb 100644 --- a/src/csolver.cc +++ b/src/csolver.cc @@ -29,7 +29,10 @@ #include "varorderingopt.h" #include #include -#include "alloyenc.h" +#include "alloyinterpreter.h" +#include "smtinterpreter.h" +#include "mathsatinterpreter.h" +#include "smtratinterpreter.h" CSolver::CSolver() : boolTrue(BooleanEdge(new BooleanConst(true))), @@ -82,8 +85,8 @@ CSolver::~CSolver() { for (uint i = 0; i < size; i++) { delete allFunctions.get(i); } - - if(interpreter != NULL){ + + if (interpreter != NULL) { delete interpreter; } @@ -162,9 +165,9 @@ CSolver *CSolver::clone() { return copy; } -CSolver *CSolver::deserialize(const char *file, bool alloy) { +CSolver *CSolver::deserialize(const char *file, InterpreterType itype) { model_print("deserializing %s ...\n", file); - Deserializer deserializer(file, alloy); + Deserializer deserializer(file, itype); return deserializer.deserialize(); } @@ -316,7 +319,7 @@ Function *CSolver::completeTable(Table *table, UndefinedBehavior behavior) { BooleanEdge CSolver::getBooleanVar(VarType type) { Boolean *boolean = new BooleanVar(type); allBooleans.push(boolean); - if(!booleanVarUsed) + if (!booleanVarUsed) booleanVarUsed = true; return BooleanEdge(boolean); } @@ -394,7 +397,7 @@ BooleanEdge CSolver::rewriteLogicalOperation(LogicOp op, BooleanEdge *array, uin } BooleanEdge CSolver::applyLogicalOperation(LogicOp op, BooleanEdge *array, uint asize) { - if(!useAlloyCompiler()){ + if (!useInterpreter()) { BooleanEdge newarray[asize]; switch (op) { case SATC_NOT: { @@ -457,7 +460,7 @@ BooleanEdge CSolver::applyLogicalOperation(LogicOp op, BooleanEdge *array, uint return applyLogicalOperation(SATC_OR, applyLogicalOperation(SATC_NOT, array[0]), array[1]); } } - + ASSERT(asize != 0); Boolean *boolean = new BooleanLogic(this, op, array, asize); Boolean *b = boolMap.get(boolean); @@ -475,7 +478,7 @@ BooleanEdge CSolver::applyLogicalOperation(LogicOp op, BooleanEdge *array, uint Boolean *boolean = new BooleanLogic(this, op, array, asize); allBooleans.push(boolean); return BooleanEdge(boolean); - + } } @@ -494,7 +497,7 @@ BooleanEdge CSolver::orderConstraint(Order *order, uint64_t first, uint64_t seco } } Boolean *constraint = new BooleanOrder(order, first, second); - if (!useAlloyCompiler() ){ + if (!useInterpreter() ) { Boolean *b = boolMap.get(constraint); if (b == NULL) { @@ -531,7 +534,7 @@ BooleanEdge CSolver::orderConstraint(Order *order, uint64_t first, uint64_t seco } void CSolver::addConstraint(BooleanEdge constraint) { - if(!useAlloyCompiler()){ + if (!useInterpreter()) { if (isTrue(constraint)) return; else if (isFalse(constraint)) { @@ -569,7 +572,7 @@ void CSolver::addConstraint(BooleanEdge constraint) { replaceBooleanWithTrueNoRemove(constraint); constraint->parents.clear(); } - } else{ + } else { constraints.add(constraint); constraint->parents.clear(); } @@ -602,6 +605,9 @@ void CSolver::inferFixedOrders() { } int CSolver::solve() { + if (isUnSAT()) { + return IS_UNSAT; + } long long startTime = getTimeNano(); bool deleteTuner = false; if (tuner == NULL) { @@ -609,12 +615,12 @@ int CSolver::solve() { deleteTuner = true; } int result = IS_INDETER; - if(useAlloyCompiler()){ + if (useInterpreter()) { interpreter->encode(); - model_print("Problem encoded in Alloy\n"); + model_print("Problem encoded in Interpreter\n"); result = interpreter->solve(); - model_print("Problem solved by Alloy\n"); - } else{ + model_print("Problem solved by Interpreter\n"); + } else { { SetIteratorOrder *orderit = activeOrders.iterator(); @@ -650,7 +656,7 @@ int CSolver::solve() { eg.encode(); naiveEncodingDecision(this); - // eg.validate(); + // eg.validate(); VarOrderingOpt bor(this, satEncoder); bor.doTransform(); @@ -664,7 +670,7 @@ int CSolver::solve() { model_print("Elapse Encode time: %f\n", (time1 - startTime) / NANOSEC); model_print("Is problem UNSAT after encoding: %d\n", unsat); - + result = unsat ? IS_UNSAT : satEncoder->solve(satsolverTimeout); model_print("Result Computed in SAT solver:\t%s\n", result == IS_SAT ? "SAT" : result == IS_INDETER ? "INDETERMINATE" : " UNSAT"); @@ -679,9 +685,29 @@ int CSolver::solve() { return result; } -void CSolver::setAlloyEncoder(){ - if(interpreter == NULL){ - interpreter = new AlloyEnc(this); +void CSolver::setInterpreter(InterpreterType type) { + if (interpreter == NULL) { + switch (type) { + case SATUNE: + break; + case ALLOY: { + interpreter = new AlloyInterpreter(this); + break; + } case Z3: { + interpreter = new SMTInterpreter(this); + break; + } + case MATHSAT: { + interpreter = new MathSATInterpreter(this); + break; + } + case SMTRAT: { + interpreter = new SMTRatInterpreter(this); + break; + } + default: + ASSERT(0); + } } } @@ -703,8 +729,8 @@ uint64_t CSolver::getElementValue(Element *element) { case ELEMSET: case ELEMCONST: case ELEMFUNCRETURN: - return useAlloyCompiler()? interpreter->getValue(element): - getElementValueSATTranslator(this, element); + return useInterpreter() ? interpreter->getValue(element) : + getElementValueSATTranslator(this, element); default: ASSERT(0); } @@ -715,8 +741,8 @@ bool CSolver::getBooleanValue(BooleanEdge bedge) { Boolean *boolean = bedge.getBoolean(); switch (boolean->type) { case BOOLEANVAR: - return useAlloyCompiler()? interpreter->getBooleanValue(boolean): - getBooleanVariableValueSATTranslator(this, boolean); + return useInterpreter() ? interpreter->getBooleanValue(boolean) : + getBooleanVariableValueSATTranslator(this, boolean); default: ASSERT(0); }