From 53c7024baac3d67a18e987a0c313891b26da2f79 Mon Sep 17 00:00:00 2001 From: bdemsky Date: Tue, 4 Jul 2017 19:03:43 -0700 Subject: [PATCH] more code --- src/Backend/nodeedge.c | 60 +++++++++++++++++++++++++++++++++++++-- src/Backend/nodeedge.h | 22 ++++++++++++++ src/Collections/structs.h | 25 +++++++--------- src/Collections/vector.h | 14 +++++++-- 4 files changed, 102 insertions(+), 19 deletions(-) diff --git a/src/Backend/nodeedge.c b/src/Backend/nodeedge.c index deb63d3..c64c0ad 100644 --- a/src/Backend/nodeedge.c +++ b/src/Backend/nodeedge.c @@ -2,6 +2,8 @@ #include #include +VectorImpl(Edge, Edge, 16) + CNF * createCNF() { CNF * cnf=ourmalloc(sizeof(CNF)); cnf->varcount=1; @@ -10,7 +12,8 @@ CNF * createCNF() { cnf->node_array=ourcalloc(1, sizeof(Node *)*cnf->capacity); cnf->size=0; cnf->maxsize=(uint)(((double)cnf->capacity)*LOAD_FACTOR); - return cnf; + allocInlineDefVectorEdge(& cnf->constraints); + return cnf; } void deleteCNF(CNF * cnf) { @@ -19,6 +22,7 @@ void deleteCNF(CNF * cnf) { if (n!=NULL) ourfree(n); } + deleteVectorArrayEdge(& cnf->constraints); ourfree(cnf->node_array); ourfree(cnf); } @@ -49,9 +53,12 @@ void resizeCNF(CNF *cnf, uint newCapacity) { Node * allocNode(NodeType type, uint numEdges, Edge * edges, uint hashcode) { Node *n=(Node *)ourmalloc(sizeof(Node)+sizeof(Edge)*numEdges); memcpy(n->edges, edges, sizeof(Edge)*numEdges); - n->numEdges=numEdges; n->flags.type=type; + n->flags.wasExpanded=0; + n->numEdges=numEdges; n->hashCode=hashcode; + n->intAnnot[0]=0;n->intAnnot[1]=0; + n->ptrAnnot[0]=NULL;n->ptrAnnot[1]=NULL; return n; } @@ -249,8 +256,57 @@ Edge constraintITE(CNF * cnf, Edge cond, Edge thenedge, Edge elseedge) { return result; } +void addConstraint(CNF *cnf, Edge constraint) { + pushVectorEdge(&cnf->constraints, constraint); +} + Edge constraintNewVar(CNF *cnf) { uint varnum=cnf->varcount++; Edge e={(Node *) ((((uintptr_t)varnum) << VAR_SHIFT) | EDGE_IS_VAR_CONSTANT) }; return e; } + +void countPass(CNF *cnf) { + uint numConstraints=getSizeVectorEdge(&cnf->constraints); + VectorEdge *ve=allocDefVectorEdge(); + for(uint i=0; iconstraints, i)); + } + deleteVectorEdge(ve); +} + +void countConstraint(CNF *cnf, VectorEdge *stack, Edge e) { + //Skip constants and variables... + if (edgeIsVarConst(e)) + return; + + clearVectorEdge(stack);pushVectorEdge(stack, e); + + while(getSizeVectorEdge(stack) != 0) { + Edge e=lastVectorEdge(stack); popVectorEdge(stack); + bool polarity=isNegEdge(e); + Node *n=getNodePtrFromEdge(e); + if (getExpanded(n, polarity)) { + if (n->flags.type == NodeType_IFF || + n->flags.type == NodeType_ITE) { + Edge pExp={n->ptrAnnot[polarity]}; + getNodePtrFromEdge(pExp)->intAnnot[0]++; + } else { + n->intAnnot[polarity]++; + } + } else { + setExpanded(n, polarity); n->intAnnot[polarity]=1; + + if (n->flags.type == NodeType_ITE|| + n->flags.type == NodeType_IFF) { + n->intAnnot[polarity]=0; + Edge tst=n->edges[0]; + Edge thenedge=n->edges[1]; + Edge elseedge=n->flags.type == NodeType_IFF? constraintNegate(thenedge): n->edges[2]; + + } + } + + } + +} diff --git a/src/Backend/nodeedge.h b/src/Backend/nodeedge.h index a83983d..4a40e03 100644 --- a/src/Backend/nodeedge.h +++ b/src/Backend/nodeedge.h @@ -1,6 +1,7 @@ #ifndef NODEEDGE_H #define NODEEDGE_H #include "classlist.h" +#include "vector.h" #define NEGATE_EDGE 1 #define EDGE_IS_VAR_CONSTANT 2 @@ -17,6 +18,8 @@ struct Edge { Node * node_ptr; }; +VectorDef(Edge, Edge) + enum NodeType { NodeType_AND, NodeType_ITE, @@ -27,6 +30,7 @@ typedef enum NodeType NodeType; struct NodeFlags { NodeType type:2; + int wasExpanded:2; }; typedef struct NodeFlags NodeFlags; @@ -35,6 +39,8 @@ struct Node { NodeFlags flags; uint numEdges; uint hashCode; + uint intAnnot[2]; + void * ptrAnnot[2]; Edge edges[]; }; @@ -49,10 +55,19 @@ struct CNF { uint mask; uint maxsize; Node ** node_array; + VectorEdge constraints; }; typedef struct CNF CNF; +static inline bool getExpanded(Node *n, int isNegated) { + return n->flags.wasExpanded & (1<flags.wasExpanded |= (1< -#define VectorDef(name, type, defcap) \ +#define VectorDef(name, type) \ struct Vector ## name { \ uint size; \ uint capacity; \ @@ -13,7 +13,9 @@ Vector ## name * allocDefVector ## name(); \ Vector ## name * allocVectorArray ## name(uint capacity, type * array); \ void pushVector ## name(Vector ## name *vector, type item); \ - type getVector ## name(Vector ## name *vector, uint index); \ + type lastVector ## name(Vector ## name *vector); \ + void popVector ## name(Vector ## name *vector); \ + type getVector ## name(Vector ## name *vector, uint index); \ void setVector ## name(Vector ## name *vector, uint index, type item); \ uint getSizeVector ## name(Vector ## name *vector); \ void deleteVector ## name(Vector ## name *vector); \ @@ -41,7 +43,13 @@ memcpy(tmp->array, array, capacity * sizeof(type)); \ return tmp; \ } \ - void pushVector ## name(Vector ## name *vector, type item) { \ + void popVector ## name(Vector ## name *vector) { \ + vector->size--; \ + } \ + type lastVector ## name(Vector ## name *vector) { \ + return vector->array[vector->size]; \ + } \ + void pushVector ## name(Vector ## name *vector, type item) { \ if (vector->size >= vector->capacity) { \ uint newcap=vector->capacity * 2; \ vector->array=(type *)ourrealloc(vector->array, newcap); \ -- 2.34.1