#include "set.h"
-void orderIntegerEncodingSATEncoder(SATEncoder *This, BooleanOrder *boolOrder) {
+void orderIntegerEncodingSATEncoder(CSolver *solver, BooleanOrder *boolOrder) {
Order *order = boolOrder->order;
if (order->elementTable == NULL) {
order->initializeOrderElementsHashTable();
}
//getting two elements and using LT predicate ...
- ElementSet *elem1 = (ElementSet *)getOrderIntegerElement(This, order, boolOrder->first);
- ElementSet *elem2 = (ElementSet *)getOrderIntegerElement(This, order, boolOrder->second);
+ ElementSet *elem1 = (ElementSet *)getOrderIntegerElement(solver, order, boolOrder->first);
+ ElementSet *elem2 = (ElementSet *)getOrderIntegerElement(solver, order, boolOrder->second);
Set *sarray[] = {elem1->set, elem2->set};
- Predicate *predicate = This->solver->createPredicateOperator(LT, sarray, 2);
+ Predicate *predicate = solver->createPredicateOperator(LT, sarray, 2);
Element *parray[] = {elem1, elem2};
- Boolean *boolean = This->solver->applyPredicate(predicate, parray, 2);
- This->solver->addConstraint(boolean);
- This->solver->replaceBooleanWithBoolean(boolOrder, boolean);
+ Boolean *boolean = solver->applyPredicate(predicate, parray, 2);
+ solver->addConstraint(boolean);
+ solver->replaceBooleanWithBoolean(boolOrder, boolean);
}
-Element *getOrderIntegerElement(SATEncoder *This,Order *order, uint64_t item) {
+Element *getOrderIntegerElement(CSolver * solver, Order *order, uint64_t item) {
HashSetOrderElement *eset = order->elementTable;
OrderElement oelement(item, NULL);
if ( !eset->contains(&oelement)) {
- Set *set = This->solver->createRangeSet(order->set->type, 1, (uint64_t) order->set->getSize());
- Element *elem = This->solver->getElementVar(set);
+ Set *set = solver->createRangeSet(order->set->type, 1, (uint64_t) order->set->getSize());
+ Element *elem = solver->getElementVar(set);
eset->add(new OrderElement(item, elem));
return elem;
} else
#include "classlist.h"
#include "structs.h"
-Element *getOrderIntegerElement(SATEncoder *This,Order *order, uint64_t item);
-void orderIntegerEncodingSATEncoder(SATEncoder *This, BooleanOrder *boolOrder);
-
+Element *getOrderIntegerElement(CSolver *solver, Order *order, uint64_t item);
+void orderIntegerEncodingSATEncoder(CSolver *solver, BooleanOrder *boolOrder);
#endif/* INTEGERENCODING_H */
}
int solveCNF(CNF *cnf) {
+ long long startTime=getTimeNano();
countPass(cnf);
convertPass(cnf, false);
finishedClauses(cnf->solver);
- return solve(cnf->solver);
+ long long startSolve=getTimeNano();
+ int result = solve(cnf->solver);
+ long long finishTime=getTimeNano();
+ cnf->encodeTime=startSolve-startTime;
+ cnf->solveTime=finishTime-startSolve;
+ return result;
}
bool getValueCNF(CNF *cnf, Edge var) {
IncrementalSolver *solver;
VectorEdge constraints;
VectorEdge args;
+ long long solveTime;
+ long long encodeTime;
};
typedef struct CNF CNF;
ElementEncoding *elemEnc = getElementEncoding(elem);
for (uint i = 0; i < elemEnc->encArraySize; i++) {
if (elemEnc->isinUseElement(i) && elemEnc->encodingArray[i] == value) {
- return (elemEnc->numVars == 0) ? E_True : generateBinaryConstraint(This->cnf, elemEnc->numVars, elemEnc->variables, i);
+ return (elemEnc->numVars == 0) ? E_True : generateBinaryConstraint(This->getCNF(), elemEnc->numVars, elemEnc->variables, i);
}
}
return E_False;
else if ((i + 1) == elemEnc->encArraySize)
return elemEnc->variables[i - 1];
else
- return constraintAND2(This->cnf, elemEnc->variables[i - 1], constraintNegate(elemEnc->variables[i]));
+ return constraintAND2(This->getCNF(), elemEnc->variables[i - 1], constraintNegate(elemEnc->variables[i]));
}
}
return E_False;
}
uint64_t valueminusoffset = value - elemEnc->offset;
- return generateBinaryConstraint(This->cnf, elemEnc->numVars, elemEnc->variables, valueminusoffset);
+ return generateBinaryConstraint(This->getCNF(), elemEnc->numVars, elemEnc->variables, valueminusoffset);
}
void allocElementConstraintVariables(ElementEncoding *This, uint numVars) {
getArrayNewVarsSATEncoder(This, encoding->numVars, encoding->variables);
for (uint i = 0; i < encoding->numVars; i++) {
for (uint j = i + 1; j < encoding->numVars; j++) {
- addConstraintCNF(This->cnf, constraintNegate(constraintAND2(This->cnf, encoding->variables[i], encoding->variables[j])));
+ addConstraintCNF(This->getCNF(), constraintNegate(constraintAND2(This->getCNF(), encoding->variables[i], encoding->variables[j])));
}
}
- addConstraintCNF(This->cnf, constraintOR(This->cnf, encoding->numVars, encoding->variables));
+ addConstraintCNF(This->getCNF(), constraintOR(This->getCNF(), encoding->numVars, encoding->variables));
}
void generateUnaryEncodingVars(SATEncoder *This, ElementEncoding *encoding) {
getArrayNewVarsSATEncoder(This, encoding->numVars, encoding->variables);
//Add unary constraint
for (uint i = 1; i < encoding->numVars; i++) {
- addConstraintCNF(This->cnf, constraintOR2(This->cnf, encoding->variables[i - 1], constraintNegate(encoding->variables[i])));
+ addConstraintCNF(This->getCNF(), constraintOR2(This->getCNF(), encoding->variables[i - 1], constraintNegate(encoding->variables[i])));
}
}
//TODO: Should handle sharing of AST Nodes without recoding them a second time
SATEncoder::SATEncoder(CSolver * _solver) :
- varcount(1),
cnf(createCNF()),
solver(_solver) {
}
deleteCNF(cnf);
}
+int SATEncoder::solve() {
+ return solveCNF(cnf);
+}
+
void SATEncoder::encodeAllSATEncoder(CSolver *csolver) {
HSIteratorBoolean *iterator = csolver->getConstraints();
while (iterator->hasNext()) {
}
Edge getNewVarSATEncoder(SATEncoder *This) {
- return constraintNewVar(This->cnf);
+ return constraintNewVar(This->getCNF());
}
Edge encodeVarSATEncoder(SATEncoder *This, BooleanVar *constraint) {
switch (constraint->op) {
case L_AND:
- return constraintAND(This->cnf, constraint->inputs.getSize(), array);
+ return constraintAND(This->getCNF(), constraint->inputs.getSize(), array);
case L_OR:
- return constraintOR(This->cnf, constraint->inputs.getSize(), array);
+ return constraintOR(This->getCNF(), constraint->inputs.getSize(), array);
case L_NOT:
return constraintNegate(array[0]);
case L_XOR:
- return constraintXOR(This->cnf, array[0], array[1]);
+ return constraintXOR(This->getCNF(), array[0], array[1]);
case L_IMPLIES:
- return constraintIMPLIES(This->cnf, array[0], array[1]);
+ return constraintIMPLIES(This->getCNF(), array[0], array[1]);
default:
model_print("Unhandled case in encodeLogicSATEncoder %u", constraint->op);
exit(-1);
class SATEncoder {
public:
- uint varcount;
- CNF *cnf;
- CSolver *solver;
-
+ int solve();
SATEncoder(CSolver *solver);
~SATEncoder();
void encodeAllSATEncoder(CSolver *csolver);
Edge encodeConstraintSATEncoder(Boolean *constraint);
+ CNF * getCNF() { return cnf;}
+ CSolver * getSolver() { return solver; }
+ long long getSolveTime() { return cnf->solveTime; }
+ long long getEncodeTime() { return cnf->encodeTime; }
+
MEMALLOC;
+ private:
+ CNF *cnf;
+ CSolver *solver;
};
+Edge getNewVarSATEncoder(SATEncoder *This);
+void getArrayNewVarsSATEncoder(SATEncoder *encoder, uint num, Edge *carray);
- Edge getNewVarSATEncoder(SATEncoder *This);
- void getArrayNewVarsSATEncoder(SATEncoder *encoder, uint num, Edge *carray);
-
- Edge encodeVarSATEncoder(SATEncoder *This, BooleanVar *constraint);
- Edge encodeLogicSATEncoder(SATEncoder *This, BooleanLogic *constraint);
- Edge encodePredicateSATEncoder(SATEncoder *This, BooleanPredicate *constraint);
- Edge encodeTablePredicateSATEncoder(SATEncoder *This, BooleanPredicate *constraint);
- void encodeElementSATEncoder(SATEncoder *encoder, Element *This);
- void encodeElementFunctionSATEncoder(SATEncoder *encoder, ElementFunction *This);
- void encodeTableElementFunctionSATEncoder(SATEncoder *encoder, ElementFunction *This);
+Edge encodeVarSATEncoder(SATEncoder *This, BooleanVar *constraint);
+Edge encodeLogicSATEncoder(SATEncoder *This, BooleanLogic *constraint);
+Edge encodePredicateSATEncoder(SATEncoder *This, BooleanPredicate *constraint);
+Edge encodeTablePredicateSATEncoder(SATEncoder *This, BooleanPredicate *constraint);
+void encodeElementSATEncoder(SATEncoder *encoder, Element *This);
+void encodeElementFunctionSATEncoder(SATEncoder *encoder, ElementFunction *This);
+void encodeTableElementFunctionSATEncoder(SATEncoder *encoder, ElementFunction *This);
#endif
Element *elem = constraint->inputs.get(i);
carray[i] = getElementValueConstraint(This, elem, vals[i]);
}
- Edge term = constraintAND(This->cnf, numDomains, carray);
+ Edge term = constraintAND(This->getCNF(), numDomains, carray);
pushVectorEdge(clauses, term);
}
deleteVectorEdge(clauses);
return E_False;
}
- Edge cor = constraintOR(This->cnf, getSizeVectorEdge(clauses), exposeArrayEdge(clauses));
+ Edge cor = constraintOR(This->getCNF(), getSizeVectorEdge(clauses), exposeArrayEdge(clauses));
deleteVectorEdge(clauses);
return generateNegation ? constraintNegate(cor) : cor;
}
case IGNORE:
case NOOVERFLOW:
case WRAPAROUND: {
- clause = constraintIMPLIES(This->cnf,constraintAND(This->cnf, numDomains, carray), carray[numDomains]);
+ clause = constraintIMPLIES(This->getCNF(),constraintAND(This->getCNF(), numDomains, carray), carray[numDomains]);
break;
}
case FLAGFORCESOVERFLOW: {
- clause = constraintIMPLIES(This->cnf,constraintAND(This->cnf, numDomains, carray), constraintAND2(This->cnf, carray[numDomains], constraintNegate(overFlowConstraint)));
+ clause = constraintIMPLIES(This->getCNF(),constraintAND(This->getCNF(), numDomains, carray), constraintAND2(This->getCNF(), carray[numDomains], constraintNegate(overFlowConstraint)));
break;
}
case OVERFLOWSETSFLAG: {
if (isInRange) {
- clause = constraintIMPLIES(This->cnf,constraintAND(This->cnf, numDomains, carray), carray[numDomains]);
+ clause = constraintIMPLIES(This->getCNF(),constraintAND(This->getCNF(), numDomains, carray), carray[numDomains]);
} else {
- clause = constraintIMPLIES(This->cnf,constraintAND(This->cnf, numDomains, carray), overFlowConstraint);
+ clause = constraintIMPLIES(This->getCNF(),constraintAND(This->getCNF(), numDomains, carray), overFlowConstraint);
}
break;
}
case FLAGIFFOVERFLOW: {
if (isInRange) {
- clause = constraintIMPLIES(This->cnf,constraintAND(This->cnf, numDomains, carray), constraintAND2(This->cnf, carray[numDomains], constraintNegate(overFlowConstraint)));
+ clause = constraintIMPLIES(This->getCNF(),constraintAND(This->getCNF(), numDomains, carray), constraintAND2(This->getCNF(), carray[numDomains], constraintNegate(overFlowConstraint)));
} else {
- clause = constraintIMPLIES(This->cnf,constraintAND(This->cnf, numDomains, carray), overFlowConstraint);
+ clause = constraintIMPLIES(This->getCNF(),constraintAND(This->getCNF(), numDomains, carray), overFlowConstraint);
}
break;
}
deleteVectorEdge(clauses);
return;
}
- Edge cor = constraintAND(This->cnf, getSizeVectorEdge(clauses), exposeArrayEdge(clauses));
- addConstraintCNF(This->cnf, cor);
+ Edge cor = constraintAND(This->getCNF(), getSizeVectorEdge(clauses), exposeArrayEdge(clauses));
+ addConstraintCNF(This->getCNF(), cor);
deleteVectorEdge(clauses);
}
uint numVars = ee0->numVars;
switch (predicate->op) {
case EQUALS:
- return generateEquivNVConstraint(This->cnf, numVars, ee0->variables, ee1->variables);
+ return generateEquivNVConstraint(This->getCNF(), numVars, ee0->variables, ee1->variables);
case LT:
- return generateLTConstraint(This->cnf, numVars, ee0->variables, ee1->variables);
+ return generateLTConstraint(This->getCNF(), numVars, ee0->variables, ee1->variables);
case GT:
- return generateLTConstraint(This->cnf, numVars, ee1->variables, ee0->variables);
+ return generateLTConstraint(This->getCNF(), numVars, ee1->variables, ee0->variables);
default:
ASSERT(0);
}
Edge row;
switch (undefStatus) {
case IGNOREBEHAVIOR:
- row = constraintAND(This->cnf, inputNum, carray);
+ row = constraintAND(This->getCNF(), inputNum, carray);
break;
case FLAGFORCEUNDEFINED: {
- addConstraintCNF(This->cnf, constraintIMPLIES(This->cnf,constraintAND(This->cnf, inputNum, carray), constraintNegate(undefConst)));
+ addConstraintCNF(This->getCNF(), constraintIMPLIES(This->getCNF(),constraintAND(This->getCNF(), inputNum, carray), constraintNegate(undefConst)));
if (generateNegation == (entry->output != 0)) {
continue;
}
- row = constraintAND(This->cnf, inputNum, carray);
+ row = constraintAND(This->getCNF(), inputNum, carray);
break;
}
default:
}
delete iterator;
ASSERT(i != 0);
- Edge result = generateNegation ? constraintNegate(constraintOR(This->cnf, i, constraints))
- : constraintOR(This->cnf, i, constraints);
+ Edge result = generateNegation ? constraintNegate(constraintOR(This->getCNF(), i, constraints))
+ : constraintOR(This->getCNF(), i, constraints);
printCNF(result);
return result;
}
switch (predicate->undefinedbehavior) {
case UNDEFINEDSETSFLAG:
if (isInRange) {
- clause = constraintAND(This->cnf, numDomains, carray);
+ clause = constraintAND(This->getCNF(), numDomains, carray);
} else {
- addConstraintCNF(This->cnf, constraintIMPLIES(This->cnf,constraintAND(This->cnf, numDomains, carray), undefConstraint) );
+ addConstraintCNF(This->getCNF(), constraintIMPLIES(This->getCNF(),constraintAND(This->getCNF(), numDomains, carray), undefConstraint) );
}
break;
case FLAGIFFUNDEFINED:
if (isInRange) {
- clause = constraintAND(This->cnf, numDomains, carray);
- addConstraintCNF(This->cnf, constraintIMPLIES(This->cnf,constraintAND(This->cnf, numDomains, carray), constraintNegate(undefConstraint)));
+ clause = constraintAND(This->getCNF(), numDomains, carray);
+ addConstraintCNF(This->getCNF(), constraintIMPLIES(This->getCNF(),constraintAND(This->getCNF(), numDomains, carray), constraintNegate(undefConstraint)));
} else {
- addConstraintCNF(This->cnf, constraintIMPLIES(This->cnf,constraintAND(This->cnf, numDomains, carray), undefConstraint) );
+ addConstraintCNF(This->getCNF(), constraintIMPLIES(This->getCNF(),constraintAND(This->getCNF(), numDomains, carray), undefConstraint) );
}
break;
}
Edge result = E_NULL;
ASSERT(getSizeVectorEdge(clauses) != 0);
- result = constraintOR(This->cnf, getSizeVectorEdge(clauses), exposeArrayEdge(clauses));
+ result = constraintOR(This->getCNF(), getSizeVectorEdge(clauses), exposeArrayEdge(clauses));
if (hasOverflow) {
- result = constraintOR2(This->cnf, result, undefConstraint);
+ result = constraintOR2(This->getCNF(), result, undefConstraint);
}
if (generateNegation) {
ASSERT(!hasOverflow);
Edge row;
switch (undefStatus ) {
case IGNOREBEHAVIOR: {
- row = constraintIMPLIES(This->cnf,constraintAND(This->cnf, inputNum, carray), output);
+ row = constraintIMPLIES(This->getCNF(),constraintAND(This->getCNF(), inputNum, carray), output);
break;
}
case FLAGFORCEUNDEFINED: {
Edge undefConst = This->encodeConstraintSATEncoder(func->overflowstatus);
- row = constraintIMPLIES(This->cnf,constraintAND(This->cnf, inputNum, carray), constraintAND2(This->cnf, output, constraintNegate(undefConst)));
+ row = constraintIMPLIES(This->getCNF(),constraintAND(This->getCNF(), inputNum, carray), constraintAND2(This->getCNF(), output, constraintNegate(undefConst)));
break;
}
default:
constraints[i++] = row;
}
delete iterator;
- addConstraintCNF(This->cnf, constraintAND(This->cnf, size, constraints));
+ addConstraintCNF(This->getCNF(), constraintAND(This->getCNF(), size, constraints));
}
void encodeEnumTableElemFunctionSATEncoder(SATEncoder *This, ElementFunction *elemFunc) {
case UNDEFINEDSETSFLAG: {
if (isInRange) {
//FIXME: Talk to Brian, It should be IFF not only IMPLY. --HG
- clause = constraintIMPLIES(This->cnf,constraintAND(This->cnf, numDomains, carray), carray[numDomains]);
+ clause = constraintIMPLIES(This->getCNF(),constraintAND(This->getCNF(), numDomains, carray), carray[numDomains]);
} else {
- addConstraintCNF(This->cnf, constraintIMPLIES(This->cnf,constraintAND(This->cnf, numDomains, carray), undefConstraint));
+ addConstraintCNF(This->getCNF(), constraintIMPLIES(This->getCNF(),constraintAND(This->getCNF(), numDomains, carray), undefConstraint));
}
break;
}
case FLAGIFFUNDEFINED: {
if (isInRange) {
- clause = constraintIMPLIES(This->cnf,constraintAND(This->cnf, numDomains, carray), carray[numDomains]);
- addConstraintCNF(This->cnf, constraintIMPLIES(This->cnf, constraintAND(This->cnf, numDomains, carray), constraintNegate(undefConstraint) ));
+ clause = constraintIMPLIES(This->getCNF(),constraintAND(This->getCNF(), numDomains, carray), carray[numDomains]);
+ addConstraintCNF(This->getCNF(), constraintIMPLIES(This->getCNF(), constraintAND(This->getCNF(), numDomains, carray), constraintNegate(undefConstraint) ));
} else {
- addConstraintCNF(This->cnf,constraintIMPLIES(This->cnf, constraintAND(This->cnf, numDomains, carray), undefConstraint));
+ addConstraintCNF(This->getCNF(),constraintIMPLIES(This->getCNF(), constraintAND(This->getCNF(), numDomains, carray), undefConstraint));
}
break;
}
deleteVectorEdge(clauses);
return;
}
- Edge cor = constraintAND(This->cnf, getSizeVectorEdge(clauses), exposeArrayEdge(clauses));
- addConstraintCNF(This->cnf, cor);
+ Edge cor = constraintAND(This->getCNF(), getSizeVectorEdge(clauses), exposeArrayEdge(clauses));
+ addConstraintCNF(This->getCNF(), cor);
deleteVectorEdge(clauses);
}
ASSERT(boolOrder->order->type == TOTAL);
if (boolOrder->order->orderPairTable == NULL) {
boolOrder->order->initializeOrderHashTable();
- bool doOptOrderStructure = GETVARTUNABLE(This->solver->getTuner(), boolOrder->order->type, OPTIMIZEORDERSTRUCTURE, &onoff);
+ bool doOptOrderStructure = GETVARTUNABLE(This->getSolver()->getTuner(), boolOrder->order->type, OPTIMIZEORDERSTRUCTURE, &onoff);
if (doOptOrderStructure) {
boolOrder->order->graph = buildMustOrderGraph(boolOrder->order);
- reachMustAnalysis(This->solver, boolOrder->order->graph, true);
+ reachMustAnalysis(This->getSolver(), boolOrder->order->graph, true);
}
createAllTotalOrderConstraintsSATEncoder(This, boolOrder->order);
}
OrderPair pairIK(valueI, valueK, E_NULL);
Edge constIK = getPairConstraint(This, order, &pairIK);
Edge constJK = getPairConstraint(This, order, &pairJK);
- addConstraintCNF(This->cnf, generateTransOrderConstraintSATEncoder(This, constIJ, constJK, constIK));
+ addConstraintCNF(This->getCNF(), generateTransOrderConstraintSATEncoder(This, constIJ, constJK, constIK));
}
}
}
Edge generateTransOrderConstraintSATEncoder(SATEncoder *This, Edge constIJ,Edge constJK,Edge constIK) {
Edge carray[] = {constIJ, constJK, constraintNegate(constIK)};
- Edge loop1 = constraintOR(This->cnf, 3, carray);
+ Edge loop1 = constraintOR(This->getCNF(), 3, carray);
Edge carray2[] = {constraintNegate(constIJ), constraintNegate(constJK), constIK};
- Edge loop2 = constraintOR(This->cnf, 3, carray2 );
- return constraintAND2(This->cnf, loop1, loop2);
+ Edge loop2 = constraintOR(This->getCNF(), 3, carray2 );
+ return constraintAND2(This->getCNF(), loop1, loop2);
}
Edge encodePartialOrderSATEncoder(SATEncoder *This, BooleanOrder *constraint) {
uint index = 0;
for (int i = elemEnc->numVars - 1; i >= 0; i--) {
index = index << 1;
- if (getValueSolver(This->getSATEncoder()->cnf->solver, getEdgeVar( elemEnc->variables[i] )))
+ if (getValueSolver(This->getSATEncoder()->getCNF()->solver, getEdgeVar( elemEnc->variables[i] )))
index |= 1;
}
if (elemEnc->encArraySize <= index || !elemEnc->isinUseElement(index))
uint64_t value = 0;
for (int i = elemEnc->numVars - 1; i >= 0; i--) {
value = value << 1;
- if (getValueSolver(This->getSATEncoder()->cnf->solver, getEdgeVar( elemEnc->variables[i] )) )
+ if (getValueSolver(This->getSATEncoder()->getCNF()->solver, getEdgeVar( elemEnc->variables[i] )) )
value |= 1;
}
if (elemEnc->isBinaryValSigned &&
- This->getSATEncoder()->cnf->solver->solution[ getEdgeVar( elemEnc->variables[elemEnc->numVars - 1])]) {
+ This->getSATEncoder()->getCNF()->solver->solution[ getEdgeVar( elemEnc->variables[elemEnc->numVars - 1])]) {
//Do sign extension of negative number
uint64_t highbits = 0xffffffffffffffff - ((1 << (elemEnc->numVars)) - 1);
value += highbits;
uint64_t getElementValueOneHotSATTranslator(CSolver *This, ElementEncoding *elemEnc) {
uint index = 0;
for (uint i = 0; i < elemEnc->numVars; i++) {
- if (getValueSolver(This->getSATEncoder()->cnf->solver, getEdgeVar( elemEnc->variables[i] )))
+ if (getValueSolver(This->getSATEncoder()->getCNF()->solver, getEdgeVar( elemEnc->variables[i] )))
index = i;
}
ASSERT(elemEnc->encArraySize > index && elemEnc->isinUseElement(index));
uint64_t getElementValueUnarySATTranslator(CSolver *This, ElementEncoding *elemEnc) {
uint i;
for (i = 0; i < elemEnc->numVars; i++) {
- if (!getValueSolver(This->getSATEncoder()->cnf->solver, getEdgeVar( elemEnc->variables[i] )) ) {
+ if (!getValueSolver(This->getSATEncoder()->getCNF()->solver, getEdgeVar( elemEnc->variables[i] )) ) {
break;
}
}
bool getBooleanVariableValueSATTranslator( CSolver *This, Boolean *boolean) {
int index = getEdgeVar( ((BooleanVar *) boolean)->var );
- return getValueSolver(This->getSATEncoder()->cnf->solver, index);
+ return getValueSolver(This->getSATEncoder()->getCNF()->solver, index);
}
HappenedBefore getOrderConstraintValueSATTranslator(CSolver *This, Order *order, uint64_t first, uint64_t second) {
Edge var = getOrderConstraint(order->orderPairTable, &pair);
if (edgeIsNull(var))
return UNORDERED;
- return getValueCNF(This->getSATEncoder()->cnf, var) ? FIRST : SECOND;
+ return getValueCNF(This->getSATEncoder()->getCNF(), var) ? FIRST : SECOND;
}
#include "tunable.h"
-Tuner::Tuner() {
+DefaultTuner::DefaultTuner() {
}
-int Tuner::getTunable(TunableParam param, TunableDesc *descriptor) {
+int DefaultTuner::getTunable(TunableParam param, TunableDesc *descriptor) {
return descriptor->defaultValue;
}
-int Tuner::getVarTunable(VarType vartype, TunableParam param, TunableDesc *descriptor) {
+int DefaultTuner::getVarTunable(VarType vartype, TunableParam param, TunableDesc *descriptor) {
return descriptor->defaultValue;
}
class Tuner {
public:
- Tuner();
+ virtual int getTunable(TunableParam param, TunableDesc *descriptor);
+ virtual int getVarTunable(VarType vartype, TunableParam param, TunableDesc *descriptor);
+ virtual ~Tuner();
+ MEMALLOC;
+};
+
+class DefaultTuner : public Tuner {
+public:
+ DefaultTuner();
int getTunable(TunableParam param, TunableDesc *descriptor);
int getVarTunable(VarType vartype, TunableParam param, TunableDesc *descriptor);
MEMALLOC;
};
+
+
class TunableDesc {
public:
TunableDesc(int _lowValue, int _highValue, int _defaultValue) : lowValue(_lowValue), highValue(_highValue), defaultValue(_defaultValue) {}
class OrderNode;
class OrderEdge;
+class AutoTuner;
struct IncrementalSolver;
typedef struct IncrementalSolver IncrementalSolver;
#include <stdio.h>
#include "config.h"
+#include "time.h"
/*
extern int model_out;
#define error_msg(...) fprintf(stderr, "Error: " __VA_ARGS__)
void print_trace(void);
+
+static inline long long getTimeNano() {
+ struct timespec time;
+ clock_gettime(CLOCK_REALTIME, & time);
+ return time.tv_sec * 1000000000 + time.tv_nsec;
+}
#endif/* __COMMON_H__ */
#include "tunable.h"
#include "polarityassignment.h"
#include "orderdecompose.h"
+#include "autotuner.h"
-CSolver::CSolver() : unsat(false) {
- tuner = new Tuner();
+CSolver::CSolver() :
+ unsat(false),
+ tuner(new DefaultTuner()),
+ elapsedTime(0)
+{
satEncoder = new SATEncoder(this);
}
}
int CSolver::startEncoding() {
+ long long startTime = getTimeNano();
computePolarities(this);
orderAnalysis(this);
naiveEncodingDecision(this);
satEncoder->encodeAllSATEncoder(this);
- int result = solveCNF(satEncoder->cnf);
- model_print("sat_solver's result:%d\tsolutionSize=%d\n", result, satEncoder->cnf->solver->solutionsize);
- for (int i = 1; i <= satEncoder->cnf->solver->solutionsize; i++) {
- model_print("%d, ", satEncoder->cnf->solver->solution[i]);
- }
- model_print("\n");
+ int result = satEncoder->solve();
+ long long finishTime = getTimeNano();
+ elapsedTime = finishTime - startTime;
return result;
}
return getOrderConstraintValueSATTranslator(this, order, first, second);
}
+long long CSolver::getEncodeTime() { return satEncoder->getEncodeTime(); }
+
+long long CSolver::getSolveTime() { return satEncoder->getSolveTime(); }
+
+void CSolver::autoTune() {
+ AutoTuner * autotuner=new AutoTuner();
+ autotuner->tune(this);
+}
Vector<Order *> *getOrders() { return &allOrders;}
Tuner *getTuner() { return tuner; }
-
+
HSIteratorBoolean *getConstraints() { return constraints.iterator(); }
SATEncoder *getSATEncoder() {return satEncoder;}
void replaceBooleanWithFalse(Boolean *bexpr);
void replaceBooleanWithBoolean(Boolean *oldb, Boolean *newb);
CSolver *clone();
+ void autoTune();
+ void setTuner(Tuner * _tuner) { tuner = _tuner; }
+ long long getElapsedTime() { return elapsedTime; }
+ long long getEncodeTime();
+ long long getSolveTime();
+
MEMALLOC;
private:
SATEncoder *satEncoder;
bool unsat;
Tuner *tuner;
+
+ long long elapsedTime;
};
#endif