X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=src%2Fcsolver.cc;h=45163be66ded9b2b608b518a83564cef2f328496;hb=c53a5c97df5189f82b618e510bb7fcad8671e5ff;hp=9dff5570277b7ecd3839aa4e67e101bb74aae22e;hpb=01ddee5d8a0f60bd04fc49bce29da2761b7bb3b5;p=satune.git diff --git a/src/csolver.cc b/src/csolver.cc index 9dff557..45163be 100644 --- a/src/csolver.cc +++ b/src/csolver.cc @@ -26,6 +26,7 @@ #include "orderedge.h" #include "orderanalysis.h" #include "elementopt.h" +#include "varorderingopt.h" #include #include @@ -33,8 +34,10 @@ CSolver::CSolver() : boolTrue(BooleanEdge(new BooleanConst(true))), boolFalse(boolTrue.negate()), unsat(false), + booleanVarUsed(false), tuner(NULL), - elapsedTime(0) + elapsedTime(0), + satsolverTimeout(NOTIMEOUT) { satEncoder = new SATEncoder(this); } @@ -134,6 +137,7 @@ void CSolver::resetSolver() { boolTrue = BooleanEdge(new BooleanConst(true)); boolFalse = boolTrue.negate(); unsat = false; + booleanVarUsed = false; elapsedTime = 0; tuner = NULL; satEncoder->resetSATEncoder(); @@ -153,7 +157,7 @@ CSolver *CSolver::clone() { } CSolver *CSolver::deserialize(const char *file) { - model_print("deserializing ...\n"); + model_print("deserializing %s ...\n", file); Deserializer deserializer(file); return deserializer.deserialize(); } @@ -184,8 +188,8 @@ Set *CSolver::createRangeSet(VarType type, uint64_t lowrange, uint64_t highrange return set; } -bool CSolver::itemExistInSet(Set *set, uint64_t item){ - return set->exists(item); +bool CSolver::itemExistInSet(Set *set, uint64_t item) { + return set->exists(item); } VarType CSolver::getSetVarType(Set *set) { @@ -223,8 +227,8 @@ Element *CSolver::getElementVar(Set *set) { return element; } -void CSolver::mustHaveValue(Element *element){ - element->getElementEncoding()->anyValue = true; +void CSolver::mustHaveValue(Element *element) { + element->anyValue = true; } Set *CSolver::getElementRange (Element *element) { @@ -251,6 +255,7 @@ Element *CSolver::getElementConst(VarType type, uint64_t value) { Element *CSolver::applyFunction(Function *function, Element **array, uint numArrays, BooleanEdge overflowstatus) { + ASSERT(numArrays == 2); Element *element = new ElementFunction(function,array,numArrays,overflowstatus); Element *e = elemMap.get(element); if (e == NULL) { @@ -305,6 +310,8 @@ Function *CSolver::completeTable(Table *table, UndefinedBehavior behavior) { BooleanEdge CSolver::getBooleanVar(VarType type) { Boolean *boolean = new BooleanVar(type); allBooleans.push(boolean); + if(!booleanVarUsed) + booleanVarUsed = true; return BooleanEdge(boolean); } @@ -574,9 +581,8 @@ void CSolver::inferFixedOrders() { } } -#define NANOSEC 1000000000.0 int CSolver::solve() { - long long starttime = getTimeNano(); + long long startTime = getTimeNano(); bool deleteTuner = false; if (tuner == NULL) { tuner = new DefaultTuner(); @@ -596,17 +602,17 @@ int CSolver::solve() { delete orderit; } computePolarities(this); - long long time2 = getTimeNano(); - model_print("Polarity time: %f\n", (time2 - starttime) / NANOSEC); + long long time1 = getTimeNano(); + model_print("Polarity time: %f\n", (time1 - startTime) / NANOSEC); Preprocess pp(this); pp.doTransform(); - long long time3 = getTimeNano(); - model_print("Preprocess time: %f\n", (time3 - time2) / NANOSEC); + long long time2 = getTimeNano(); + model_print("Preprocess time: %f\n", (time2 - time1) / NANOSEC); DecomposeOrderTransform dot(this); dot.doTransform(); - long long time4 = getTimeNano(); - model_print("Decompose Order: %f\n", (time4 - time3) / NANOSEC); + time1 = getTimeNano(); + model_print("Decompose Order: %f\n", (time1 - time2) / NANOSEC); IntegerEncodingTransform iet(this); iet.doTransform(); @@ -615,24 +621,28 @@ int CSolver::solve() { eop.doTransform(); EncodingGraph eg(this); - eg.buildGraph(); eg.encode(); naiveEncodingDecision(this); - long long time5 = getTimeNano(); - model_print("Encoding Graph Time: %f\n", (time5 - time4) / NANOSEC); +// eg.validate(); + + VarOrderingOpt bor(this, satEncoder); + bor.doTransform(); + + time2 = getTimeNano(); + model_print("Encoding Graph Time: %f\n", (time2 - time1) / NANOSEC); - long long startTime = getTimeNano(); satEncoder->encodeAllSATEncoder(this); - long long endTime = getTimeNano(); + time1 = getTimeNano(); - elapsedTime = endTime - startTime; - model_print("Elapse Encode time: %f\n", elapsedTime / NANOSEC); + model_print("Elapse Encode time: %f\n", (time1 - startTime) / NANOSEC); model_print("Is problem UNSAT after encoding: %d\n", unsat); - int result = unsat ? IS_UNSAT : satEncoder->solve(); - model_print("Result Computed in SAT solver: %d\n", result); - + int 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"); + time2 = getTimeNano(); + elapsedTime = time2 - startTime; + model_print("CSOLVER solve time: %f\n", elapsedTime / NANOSEC); if (deleteTuner) { delete tuner; tuner = NULL; @@ -650,10 +660,7 @@ void CSolver::printConstraints() { } void CSolver::printConstraint(BooleanEdge b) { - if (b.isNegated()) - model_print("!"); - b->print(); - model_print("\n"); + b.print(); } uint64_t CSolver::getElementValue(Element *element) {