struct Node {
uint numEdges;
- NodeType type;
+ union {
+ NodeType type;
+ uint capacity;
+ };
Edge edges[];
};
typedef struct Node Node;
+#define DEFAULT_CNF_ARRAY_SIZE 2048
+
struct CNF {
uint varcount;
+ uint asize;
IncrementalSolver *solver;
+ int * array;
long long solveTime;
long long encodeTime;
+ bool unsat;
};
typedef struct CNF CNF;
return (((uintptr_t) e.node_ptr) & (NEGATE_EDGE | EDGE_IS_VAR_CONSTANT)) == NEGATE_EDGE;
}
+static inline bool isPosNodeEdge(Edge e) {
+ return (((uintptr_t) e.node_ptr) & (NEGATE_EDGE | EDGE_IS_VAR_CONSTANT)) == 0;
+}
+
static inline Node *getNodePtrFromEdge(Edge e) {
return (Node *) (((uintptr_t) e.node_ptr) & ~((uintptr_t) EDGE_MASK));
}
uint hashNode(NodeType type, uint numEdges, Edge *edges);
Node *allocNode(NodeType type, uint numEdges, Edge *edges);
bool compareNodes(Node *node, NodeType type, uint numEdges, Edge *edges);
-Edge create(CNF *cnf, NodeType type, uint numEdges, Edge *edges);
+Edge createNode(NodeType type, uint numEdges, Edge *edges);
Edge constraintOR(CNF *cnf, uint numEdges, Edge *edges);
Edge constraintAND(CNF *cnf, uint numEdges, Edge *edges);
Edge constraintOR2(CNF *cnf, Edge left, Edge right);
int solveCNF(CNF *cnf);
bool getValueCNF(CNF *cnf, Edge var);
void printCNF(Edge e);
-
+Node *allocBaseNode(NodeType type, uint numEdges);
+Node *allocResizeNode(uint capacity);
+Edge cloneEdge(Edge e);
+void addEdgeToResizeNode(Node ** node, Edge e);
+void mergeFreeNodeToResizeNode(Node **node, Node * innode);
+void mergeNodeToResizeNode(Node **node, Node * innode);
+void freeEdgeRec(Edge e);
Edge generateBinaryConstraint(CNF *cnf, uint numvars, Edge *vars, uint value);
Edge generateLTValueConstraint(CNF *cnf, uint numvars, Edge *vars, uint value);