X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=src%2Fcsolver.cc;h=1dfe9eb8ec9cf012f9af880c672e62a9ff95c81b;hb=34ba8a7da2ea48c2fc835985eee27bf2cd3e64db;hp=3c8fffa510f16b01b6be889703e84ea83a5b7972;hpb=ab88f3e4fab3b0823ff6c6bc908921af554e4155;p=satune.git diff --git a/src/csolver.cc b/src/csolver.cc index 3c8fffa..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))), @@ -39,7 +42,7 @@ CSolver::CSolver() : tuner(NULL), elapsedTime(0), satsolverTimeout(NOTIMEOUT), - alloyEncoder(NULL) + interpreter(NULL) { satEncoder = new SATEncoder(this); } @@ -83,6 +86,10 @@ CSolver::~CSolver() { delete allFunctions.get(i); } + if (interpreter != NULL) { + delete interpreter; + } + delete boolTrue.getBoolean(); delete satEncoder; } @@ -158,9 +165,9 @@ CSolver *CSolver::clone() { return copy; } -CSolver *CSolver::deserialize(const char *file) { +CSolver *CSolver::deserialize(const char *file, InterpreterType itype) { model_print("deserializing %s ...\n", file); - Deserializer deserializer(file); + Deserializer deserializer(file, itype); return deserializer.deserialize(); } @@ -312,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); } @@ -390,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: { @@ -453,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); @@ -471,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); - + } } @@ -490,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) { @@ -527,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)) { @@ -565,7 +572,7 @@ void CSolver::addConstraint(BooleanEdge constraint) { replaceBooleanWithTrueNoRemove(constraint); constraint->parents.clear(); } - } else{ + } else { constraints.add(constraint); constraint->parents.clear(); } @@ -598,6 +605,9 @@ void CSolver::inferFixedOrders() { } int CSolver::solve() { + if (isUnSAT()) { + return IS_UNSAT; + } long long startTime = getTimeNano(); bool deleteTuner = false; if (tuner == NULL) { @@ -605,12 +615,12 @@ int CSolver::solve() { deleteTuner = true; } int result = IS_INDETER; - if(useAlloyCompiler()){ - alloyEncoder->encode(); - model_print("Problem encoded in Alloy\n"); - result = alloyEncoder->solve(); - model_print("Problem solved by Alloy\n"); - } else{ + if (useInterpreter()) { + interpreter->encode(); + model_print("Problem encoded in Interpreter\n"); + result = interpreter->solve(); + model_print("Problem solved by Interpreter\n"); + } else { { SetIteratorOrder *orderit = activeOrders.iterator(); @@ -646,7 +656,7 @@ int CSolver::solve() { eg.encode(); naiveEncodingDecision(this); - // eg.validate(); + // eg.validate(); VarOrderingOpt bor(this, satEncoder); bor.doTransform(); @@ -660,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"); @@ -675,8 +685,30 @@ int CSolver::solve() { return result; } -void CSolver::setAlloyEncoder(){ - alloyEncoder = 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); + } + } } void CSolver::printConstraints() { @@ -697,8 +729,8 @@ uint64_t CSolver::getElementValue(Element *element) { case ELEMSET: case ELEMCONST: case ELEMFUNCRETURN: - return useAlloyCompiler()? alloyEncoder->getValue(element): - getElementValueSATTranslator(this, element); + return useInterpreter() ? interpreter->getValue(element) : + getElementValueSATTranslator(this, element); default: ASSERT(0); } @@ -709,8 +741,8 @@ bool CSolver::getBooleanValue(BooleanEdge bedge) { Boolean *boolean = bedge.getBoolean(); switch (boolean->type) { case BOOLEANVAR: - return useAlloyCompiler()? alloyEncoder->getBooleanValue(boolean): - getBooleanVariableValueSATTranslator(this, boolean); + return useInterpreter() ? interpreter->getBooleanValue(boolean) : + getBooleanVariableValueSATTranslator(this, boolean); default: ASSERT(0); }