#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.
ourfree(cnf);
}
+void resetCNF(CNF *cnf){
+ for (uint i = 0; i < cnf->capacity; i++) {
+ Node *n = cnf->node_array[i];
+ if (n != NULL)
+ ourfree(n);
+ }
+ clearVectorEdge(&cnf->constraints);
+ clearVectorEdge(&cnf->args);
+ deleteIncrementalSolver(cnf->solver);
+ memset(cnf->node_array, 0, sizeof(Node *) * cnf->capacity);
+
+ cnf->varcount = 1;
+ cnf->size = 0;
+ cnf->enableMatching = true;
+ cnf->solver = allocIncrementalSolver();
+ cnf->solveTime = 0;
+ cnf->encodeTime = 0;
+}
+
void resizeCNF(CNF *cnf, uint newCapacity) {
Node **old_array = cnf->node_array;
Node **new_array = (Node **) ourcalloc(1, sizeof(Node *) * newCapacity);
}
uint hashNode(NodeType type, uint numEdges, Edge *edges) {
- uint hashvalue = type ^ numEdges;
+ uint hash = type;
+ hash += hash << 10;
+ hash ^= hash >> 6;
for (uint i = 0; i < numEdges; i++) {
- hashvalue ^= (uint) ((uintptr_t) edges[i].node_ptr);
- hashvalue = (hashvalue << 3) | (hashvalue >> 29); //rotate left by 3 bits
+ uint c = (uint) ((uintptr_t) edges[i].node_ptr);
+ hash += c;
+ hash += hash << 10;
+ hash += hash >> 6;
}
- return (uint) hashvalue;
+ hash += hash << 3;
+ hash ^= hash >> 11;
+ hash += hash << 15;
+ return hash;
}
bool compareNodes(Node *node, NodeType type, uint numEdges, Edge *edges) {
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++;
int result = solve(cnf->solver);
long long finishTime = getTimeNano();
cnf->encodeTime = startSolve - startTime;
+ model_print("CNF Encode time: %f\n", cnf->encodeTime/1000000000.0);
cnf->solveTime = finishTime - startSolve;
+ model_print("Solve time: %f\n", cnf->solveTime/ 1000000000.0);
return result;
}