X-Git-Url: http://plrg.eecs.uci.edu/git/?p=satune.git;a=blobdiff_plain;f=src%2FBackend%2Fsatencoder.cc;h=618b8c17c22114177393754313dda6a3c1d8aa5c;hp=fdeee9ee8816faf0c812a7696bde8e69b6ba95eb;hb=cbd921ee35b6a29934fd7cecccde7f160228af17;hpb=0703630a40f4fcfd8c8dcad336472907f125c86c diff --git a/src/Backend/satencoder.cc b/src/Backend/satencoder.cc index fdeee9e..618b8c1 100644 --- a/src/Backend/satencoder.cc +++ b/src/Backend/satencoder.cc @@ -11,21 +11,33 @@ #include "order.h" #include "predicate.h" #include "set.h" +#include "tunable.h" SATEncoder::SATEncoder(CSolver *_solver) : cnf(createCNF()), - solver(_solver) { + solver(_solver), + vector(allocDefVectorEdge()) { } SATEncoder::~SATEncoder() { deleteCNF(cnf); + deleteVectorEdge(vector); } -int SATEncoder::solve() { +void SATEncoder::resetSATEncoder() { + resetCNF(cnf); + booledgeMap.reset(); +} + +int SATEncoder::solve(long timeout) { + cnf->solver->timeout = timeout; return solveCNF(cnf); } void SATEncoder::encodeAllSATEncoder(CSolver *csolver) { + if(csolver->isUnSAT()){ + return; + } SetIteratorBooleanEdge *iterator = csolver->getConstraints(); while (iterator->hasNext()) { BooleanEdge constraint = iterator->next(); @@ -37,7 +49,7 @@ void SATEncoder::encodeAllSATEncoder(CSolver *csolver) { Edge SATEncoder::encodeConstraintSATEncoder(BooleanEdge c) { Edge result; - Boolean * constraint = c.getBoolean(); + Boolean *constraint = c.getBoolean(); if (booledgeMap.contains(constraint)) { Edge e = {(Node *) booledgeMap.get(constraint)}; @@ -57,11 +69,23 @@ Edge SATEncoder::encodeConstraintSATEncoder(BooleanEdge c) { case PREDICATEOP: result = encodePredicateSATEncoder((BooleanPredicate *) constraint); break; + case BOOLCONST: + result = ((BooleanConst *) constraint)->isTrue() ? E_True : E_False; + break; default: model_print("Unhandled case in encodeConstraintSATEncoder %u", constraint->type); exit(-1); } - booledgeMap.put(constraint, result.node_ptr); + Polarity p = constraint->polarity; + uint pSize = constraint->parents.getSize(); + + if ( !edgeIsVarConst(result) && pSize > (uint)solver->getTuner()->getTunable(PROXYVARIABLE, &proxyparameter) ) { + Edge e = getNewVarSATEncoder(); + generateProxy(cnf, result, e, p); + booledgeMap.put(constraint, e.node_ptr); + result = e; + } + return c.isNegated() ? constraintNegate(result) : result; } @@ -92,11 +116,12 @@ Edge SATEncoder::encodeLogicSATEncoder(BooleanLogic *constraint) { case SATC_NOT: return constraintNegate(array[0]); case SATC_IFF: + ASSERT(constraint->inputs.getSize() == 2); return constraintIFF(cnf, array[0], array[1]); case SATC_OR: case SATC_XOR: case SATC_IMPLIES: - //Don't handle, translate these away... + //Don't handle, translate these away... default: model_print("Unhandled case in encodeLogicSATEncoder %u", constraint->op); exit(-1);