#include "inc_solver.h"
#include "cnfexpr.h"
#include "common.h"
+#include "qsort.h"
/*
V2 Copyright (c) 2014 Ben Chambers, Eugene Goldberg, Pete Manolios,
Vasilis Papavasileiou, Sudarshan Srinivasan, and Daron Vroon.
initDefVectorEdge(&cnf->constraints);
initDefVectorEdge(&cnf->args);
cnf->solver = allocIncrementalSolver();
+ cnf->solveTime = 0;
+ cnf->encodeTime = 0;
return cnf;
}
uint newMask = newCapacity - 1;
for (uint i = 0; i < oldCapacity; i++) {
Node *n = old_array[i];
+ if (n == NULL)
+ continue;
uint hashCode = n->hashCode;
uint newindex = hashCode & newMask;
for (;; newindex = (newindex + 1) & newMask) {
}
}
*n_ptr = allocNode(type, numEdges, edges, hashvalue);
+ cnf->size++;
Edge e = {*n_ptr};
return e;
}
Edge constraintAND(CNF *cnf, uint numEdges, Edge *edges) {
ASSERT(numEdges != 0);
- qsort(edges, numEdges, sizeof(Edge), (int (*)(const void *, const void *))comparefunction);
+ bsdqsort(edges, numEdges, sizeof(Edge), (int (*)(const void *, const void *))comparefunction);
uint initindex = 0;
while (initindex < numEdges && equalsEdge(edges[initindex], E_True))
initindex++;
void addConstraintCNF(CNF *cnf, Edge constraint) {
pushVectorEdge(&cnf->constraints, constraint);
- model_print("****ADDING NEW Constraint*****\n");
+#ifdef CONFIG_DEBUG
+ model_print("****SATC_ADDING NEW Constraint*****\n");
printCNF(constraint);
model_print("\n******************************\n");
+#endif
}
Edge constraintNewVar(CNF *cnf) {
}
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) {
int eL = argExp->litSize; // lits in argument
int aC = getClauseSizeCNF(accum); // clauses in accum
int eC = getClauseSizeCNF(argExp); // clauses in argument
-
- if (eC > CLAUSE_MAX || (eL * aC + aL * eC > eL + aC + aL + aC)) {
+ //POSSIBLE BUG #2 (eL * aC +aL * eC > eL +aC +aL +aC)
+ if (eC > CLAUSE_MAX || (eL * aC + aL * eC > eL + eC + aL + aC)) {
disjoinCNFLit(accum, introProxy(cnf, arg, argExp, isNegEdge(arg)));
} else {
disjoinCNFExpr(accum, argExp, destroy);
return constraintAND(cnf, numvars, array);
}
-Edge generateLTConstraint(CNF *cnf, uint numvars, Edge *var1, Edge *var2){
- if(numvars == 0 )
+Edge generateLTConstraint(CNF *cnf, uint numvars, Edge *var1, Edge *var2) {
+ if (numvars == 0 )
return E_False;
- Edge result =constraintAND2(cnf, constraintNegate( var1[0]), var2[0]);
+ Edge result = constraintAND2(cnf, constraintNegate( var1[0]), var2[0]);
for (uint i = 1; i < numvars; i++) {
Edge lt = constraintAND2(cnf, constraintNegate( var1[i]), var2[i]);
- Edge eq = constraintAND2(cnf, constraintIFF(cnf, var1[i], var2[i]), result);
- result = constraintOR2(cnf, lt, eq);
+ Edge eq = constraintAND2(cnf, constraintIFF(cnf, var1[i], var2[i]), result);
+ result = constraintOR2(cnf, lt, eq);
}
return result;
}
-Edge generateLTEConstraint(CNF *cnf, uint numvars, Edge *var1, Edge *var2){
- if(numvars == 0 )
+Edge generateLTEConstraint(CNF *cnf, uint numvars, Edge *var1, Edge *var2) {
+ if (numvars == 0 )
return E_True;
- Edge result =constraintIMPLIES(cnf, var1[0], var2[0]);
+ Edge result = constraintIMPLIES(cnf, var1[0], var2[0]);
for (uint i = 1; i < numvars; i++) {
Edge lt = constraintAND2(cnf, constraintNegate( var1[i]), var2[i]);
- Edge eq = constraintAND2(cnf, constraintIFF(cnf, var1[i], var2[i]), result);
- result = constraintOR2(cnf, lt, eq);
+ Edge eq = constraintAND2(cnf, constraintIFF(cnf, var1[i], var2[i]), result);
+ result = constraintOR2(cnf, lt, eq);
}
return result;
}