After resolving conflicts
authorHamed Gorjiara <hgorjiar@uci.edu>
Mon, 23 Oct 2017 09:35:11 +0000 (02:35 -0700)
committerHamed Gorjiara <hgorjiar@uci.edu>
Mon, 23 Oct 2017 09:35:11 +0000 (02:35 -0700)
70 files changed:
src/AST/astops.h
src/AST/boolean.cc
src/AST/boolean.h
src/AST/element.cc
src/AST/element.h
src/AST/function.cc
src/AST/function.h
src/AST/iterator.cc
src/AST/iterator.h
src/AST/mutableset.cc
src/AST/order.cc
src/AST/order.h
src/AST/predicate.cc
src/AST/predicate.h
src/AST/rewriter.cc
src/AST/set.cc
src/AST/set.h
src/AST/table.cc
src/AST/table.h
src/ASTAnalyses/Encoding/encodinggraph.cc
src/ASTAnalyses/Encoding/encodinggraph.h
src/ASTAnalyses/Encoding/subgraph.cc
src/ASTAnalyses/Encoding/subgraph.h
src/ASTAnalyses/Order/orderanalysis.cc
src/ASTAnalyses/Order/orderanalysis.h
src/ASTAnalyses/Order/ordergraph.cc
src/ASTAnalyses/Order/ordergraph.h
src/ASTAnalyses/Order/ordernode.cc
src/ASTAnalyses/Order/ordernode.h
src/ASTAnalyses/Polarity/polarityassignment.cc
src/ASTTransform/decomposeordertransform.cc
src/ASTTransform/decomposeordertransform.h
src/ASTTransform/integerencoding.cc
src/ASTTransform/preprocess.cc
src/ASTTransform/preprocess.h
src/Backend/constraint.cc
src/Backend/orderpair.cc
src/Backend/orderpair.h
src/Backend/satencoder.cc
src/Backend/satorderencoder.cc
src/Collections/corestructs.h
src/Collections/hashset.h
src/Collections/hashtable.h
src/Collections/qsort.cc
src/Collections/structs.cc
src/Collections/structs.h
src/Collections/vector.h
src/Encoders/elementencoding.cc
src/Encoders/elementencoding.h
src/Encoders/naiveencoder.cc
src/Encoders/orderencoding.cc
src/Serialize/deserializer.cc
src/Serialize/deserializer.h
src/Serialize/serializer.cc
src/Serialize/serializer.h
src/Test/bug1.cc
src/Test/bug_minimal.cc
src/Test/constraint.cc [new file with mode: 0644]
src/Test/graphtest.cc [new file with mode: 0644]
src/Test/ordertest.cc
src/Translator/decomposeorderresolver.cc
src/Translator/decomposeorderresolver.h
src/Translator/orderpairresolver.cc
src/Translator/orderpairresolver.h
src/Tuner/searchtuner.cc
src/classlist.h
src/common.h
src/csolver.cc
src/csolver.h
src/mymemory.h

index ebe9fc07b690ff1fb35f9a5b2df47ee865be1eff..c385ba5c4fd93d388f3d848b31ca441755cd9ac2 100644 (file)
@@ -8,7 +8,7 @@ enum PredicateType {TABLEPRED, OPERATORPRED};
 typedef enum PredicateType PredicateType;
 
 enum ASTNodeType {ORDERCONST, BOOLEANVAR, LOGICOP, PREDICATEOP, BOOLCONST, ELEMSET, ELEMFUNCRETURN, ELEMCONST,
-       BOOLEANEDGE, ORDERTYPE, SETTYPE, PREDTABLETYPE, PREDOPERTYPE, TABLETYPE, FUNCTABLETYPE, FUNCOPTYPE};
+                                                                       BOOLEANEDGE, ORDERTYPE, SETTYPE, PREDTABLETYPE, PREDOPERTYPE, TABLETYPE, FUNCTABLETYPE, FUNCOPTYPE};
 typedef enum ASTNodeType ASTNodeType;
 
 enum Polarity {P_UNDEFINED=0, P_TRUE=1, P_FALSE=2, P_BOTHTRUEFALSE=3};
@@ -17,6 +17,8 @@ typedef enum Polarity Polarity;
 enum BooleanValue {BV_UNDEFINED=0, BV_MUSTBETRUE=1, BV_MUSTBEFALSE=2, BV_UNSAT=3};
 typedef enum BooleanValue BooleanValue;
 
+extern const char *elemEncTypeNames[];
+
 enum ElementEncodingType {
        ELEM_UNASSIGNED, ONEHOT, UNARY, BINARYINDEX, BINARYVAL
 };
index 9196d07765b84e8db76f6b9582867287adf1f03d..f7d3e8822b1240d5bbd75f0f92de0aa88c67f686 100644 (file)
@@ -47,9 +47,9 @@ BooleanLogic::BooleanLogic(CSolver *solver, LogicOp _op, BooleanEdge *array, uin
 }
 
 BooleanEdge cloneEdge(CSolver *solver, CloneMap *map, BooleanEdge e) {
-       bool isnegated=e.isNegated();
-       Boolean *b=e->clone(solver, map);
-       BooleanEdge be=BooleanEdge(b);
+       bool isnegated = e.isNegated();
+       Boolean *b = e->clone(solver, map);
+       BooleanEdge be = BooleanEdge(b);
        return isnegated ? be.negate() : be;
 }
 
@@ -62,7 +62,7 @@ Boolean *BooleanVar::clone(CSolver *solver, CloneMap *map) {
        if (b != NULL)
                return b;
        BooleanEdge bvar = solver->getBooleanVar(type);
-       Boolean * base=bvar.getRaw();
+       Boolean *base = bvar.getRaw();
        map->put(this, base);
        return base;
 }
@@ -92,120 +92,120 @@ Boolean *BooleanPredicate::clone(CSolver *solver, CloneMap *map) {
 }
 
 void BooleanPredicate::updateParents() {
-       for(uint i=0;i < inputs.getSize(); i++) inputs.get(i)->parents.push(this);
+       for (uint i = 0; i < inputs.getSize(); i++) inputs.get(i)->parents.push(this);
 }
 
 void BooleanLogic::updateParents() {
-       for(uint i=0;i < inputs.getSize(); i++) inputs.get(i)->parents.push(this);
+       for (uint i = 0; i < inputs.getSize(); i++) inputs.get(i)->parents.push(this);
 }
 
-void BooleanVar::serialize(Serializer* serializer){
-       if(serializer->isSerialized(this))
+void BooleanVar::serialize(Serializer *serializer) {
+       if (serializer->isSerialized(this))
                return;
        serializer->addObject(this);
        serializer->mywrite(&type, sizeof(ASTNodeType));
-       BooleanVarThis = this;
-       serializer->mywrite(&This, sizeof(BooleanVar*));
+       BooleanVar *This = this;
+       serializer->mywrite(&This, sizeof(BooleanVar *));
        serializer->mywrite(&vtype, sizeof(VarType));
 }
 
-void BooleanVar::print(){
-        model_println("BooleanVar:%lu", (uintptr_t)this);
+void BooleanVar::print() {
+       model_print("BooleanVar:%lu\n", (uintptr_t)this);
 }
 
-void BooleanConst::print(){
-        model_println("BooleanConst:%s", istrue?"TRUE" :"FALSE");
+void BooleanConst::print() {
+       model_print("BooleanConst:%s\n", istrue ? "TRUE" : "FALSE");
 }
 
-void BooleanOrder::serialize(Serializer* serializer){
-       if(serializer->isSerialized(this))
+void BooleanOrder::serialize(Serializer *serializer) {
+       if (serializer->isSerialized(this))
                return;
        serializer->addObject(this);
        order->serialize(serializer);
-       
+
        serializer->mywrite(&type, sizeof(ASTNodeType));
-       BooleanOrderThis = this;
-       serializer->mywrite(&This, sizeof(BooleanOrder*));
-       serializer->mywrite(&order, sizeof(Order*));
+       BooleanOrder *This = this;
+       serializer->mywrite(&This, sizeof(BooleanOrder *));
+       serializer->mywrite(&order, sizeof(Order *));
        serializer->mywrite(&first, sizeof(uint64_t));
        serializer->mywrite(&second, sizeof(uint64_t));
 }
 
-void BooleanOrder::print(){
-       model_println("{BooleanOrder: First= %lu, Second = %lu on Order:", first, second);
+void BooleanOrder::print() {
+       model_print("{BooleanOrder: First= %lu, Second = %lu on Order:\n", first, second);
        order->print();
-        model_println("}\n");
+       model_print("}\n");
 }
 
-void BooleanPredicate::serialize(Serializer* serializer){
-       if(serializer->isSerialized(this))
+void BooleanPredicate::serialize(Serializer *serializer) {
+       if (serializer->isSerialized(this))
                return;
        serializer->addObject(this);
-       
+
        predicate->serialize(serializer);
        uint size = inputs.getSize();
-       for(uint i=0; i<size; i++){
-               Elementinput = inputs.get(i);
+       for (uint i = 0; i < size; i++) {
+               Element *input = inputs.get(i);
                input->serialize(serializer);
        }
        serializeBooleanEdge(serializer, undefStatus);
-       
+
        serializer->mywrite(&type, sizeof(ASTNodeType));
-       BooleanPredicateThis = this;
-       serializer->mywrite(&This, sizeof(BooleanPredicate*));
+       BooleanPredicate *This = this;
+       serializer->mywrite(&This, sizeof(BooleanPredicate *));
        serializer->mywrite(&predicate, sizeof(Predicate *));
        serializer->mywrite(&size, sizeof(uint));
-       for(uint i=0; i<size; i++){
+       for (uint i = 0; i < size; i++) {
                Element *input = inputs.get(i);
                serializer->mywrite(&input, sizeof(Element *));
        }
-       Boolean* undefStat = undefStatus!= BooleanEdge(NULL)?undefStatus.getRaw() : NULL;
-       serializer->mywrite(&undefStat, sizeof(Boolean*));
+       Boolean *undefStat = undefStatus != BooleanEdge(NULL) ? undefStatus.getRaw() : NULL;
+       serializer->mywrite(&undefStat, sizeof(Boolean *));
 }
 
-void BooleanPredicate::print(){
-       model_println("{BooleanPredicate:");
-        predicate->print();
-       model_println("elements:");
-        uint size = inputs.getSize();
-       for(uint i=0; i<size; i++){
+void BooleanPredicate::print() {
+       model_print("{BooleanPredicate:\n");
+       predicate->print();
+       model_print("elements:\n");
+       uint size = inputs.getSize();
+       for (uint i = 0; i < size; i++) {
                Element *input = inputs.get(i);
                input->print();
        }
-        model_println("}\n");
+       model_print("}\n");
 }
 
-void BooleanLogic::serialize(Serializer* serializer){
-       if(serializer->isSerialized(this))
+void BooleanLogic::serialize(Serializer *serializer) {
+       if (serializer->isSerialized(this))
                return;
        serializer->addObject(this);
        uint size = inputs.getSize();
-       for(uint i=0; i<size; i++){
+       for (uint i = 0; i < size; i++) {
                BooleanEdge input = inputs.get(i);
                serializeBooleanEdge(serializer, input);
        }
        serializer->mywrite(&type, sizeof(ASTNodeType));
-       BooleanLogicThis = this;
-       serializer->mywrite(&This, sizeof(BooleanLogic*));
+       BooleanLogic *This = this;
+       serializer->mywrite(&This, sizeof(BooleanLogic *));
        serializer->mywrite(&op, sizeof(LogicOp));
        serializer->mywrite(&size, sizeof(uint));
-       for(uint i=0; i<size; i++){
-               Booleaninput = inputs.get(i).getRaw();
-               serializer->mywrite(&input, sizeof(Boolean*));
+       for (uint i = 0; i < size; i++) {
+               Boolean *input = inputs.get(i).getRaw();
+               serializer->mywrite(&input, sizeof(Boolean *));
        }
 }
 
-void BooleanLogic::print(){
-       model_println("{BooleanLogic: %s", 
-                op ==SATC_AND? "AND": op == SATC_OR? "OR": op==SATC_NOT? "NOT":
-                op == SATC_XOR? "XOR" : op==SATC_IFF? "IFF" : "IMPLIES");
-        uint size = inputs.getSize();
-       for(uint i=0; i<size; i++){
+void BooleanLogic::print() {
+       model_print("{BooleanLogic: %s\n",
+                                                       op == SATC_AND ? "AND" : op == SATC_OR ? "OR" : op == SATC_NOT ? "NOT" :
+                                                       op == SATC_XOR ? "XOR" : op == SATC_IFF ? "IFF" : "IMPLIES");
+       uint size = inputs.getSize();
+       for (uint i = 0; i < size; i++) {
                BooleanEdge input = inputs.get(i);
-                if(input.isNegated())
-                        model_print("!");
-                input.getBoolean()->print();
+               if (input.isNegated())
+                       model_print("!");
+               input.getBoolean()->print();
        }
-        model_println("}\n");
+       model_print("}\n");
 }
 
index 3674d9f29d5e934bd94e90ecd1dfe93a488b3e9c..9864d9bb3d39ff7ffcebb8ac01df2e5d93a9db80 100644 (file)
@@ -15,15 +15,15 @@ public:
        Boolean(ASTNodeType _type);
        virtual ~Boolean() {}
        virtual Boolean *clone(CSolver *solver, CloneMap *map) = 0;
-       virtual void serialize(Serializer* ) = 0;
-        virtual void print() =0;
+       virtual void serialize(Serializer * ) = 0;
+       virtual void print() = 0;
        virtual bool isTrue() {return boolVal == BV_MUSTBETRUE;}
        virtual bool isFalse() {return boolVal == BV_MUSTBEFALSE;}
        Polarity polarity;
        BooleanValue boolVal;
        Vector<Boolean *> parents;
        virtual void updateParents() {}
-       
+
        CMEMALLOC;
 };
 
@@ -33,8 +33,8 @@ public:
        Boolean *clone(CSolver *solver, CloneMap *map);
        bool isTrue() {return istrue;}
        bool isFalse() {return !istrue;}
-       void serialize(Serializer *serializer ){};
-        virtual void print();
+       void serialize(Serializer *serializer ) {};
+       virtual void print();
        bool istrue;
        CMEMALLOC;
 };
@@ -44,7 +44,7 @@ public:
        BooleanVar(VarType t);
        Boolean *clone(CSolver *solver, CloneMap *map);
        void serialize(Serializer *serializer );
-        virtual void print();
+       virtual void print();
        VarType vtype;
        Edge var;
        CMEMALLOC;
@@ -55,7 +55,7 @@ public:
        BooleanOrder(Order *_order, uint64_t _first, uint64_t _second);
        Boolean *clone(CSolver *solver, CloneMap *map);
        void serialize(Serializer *serializer );
-        virtual void print();
+       virtual void print();
 
        Order *order;
        uint64_t first;
@@ -71,7 +71,7 @@ public:
        FunctionEncoding *getFunctionEncoding() {return &encoding;}
        void updateParents();
        void serialize(Serializer *serializer );
-        virtual void print();
+       virtual void print();
        CMEMALLOC;
 
        Predicate *predicate;
@@ -85,12 +85,12 @@ public:
        BooleanLogic(CSolver *solver, LogicOp _op, BooleanEdge *array, uint asize);
        Boolean *clone(CSolver *solver, CloneMap *map);
        void serialize(Serializer *serializer );
-        virtual void print();
+       virtual void print();
        LogicOp op;
        bool replaced;
        Array<BooleanEdge> inputs;
        void updateParents();
-       
+
        CMEMALLOC;
 };
 BooleanEdge cloneEdge(CSolver *solver, CloneMap *map, BooleanEdge e);
index fb5b8222badb2f4064215bfe74202d8c25e02532..62e0c4c111af9f5112ca4674c8de79e77c3c8a64 100644 (file)
@@ -57,85 +57,87 @@ Element *ElementFunction::clone(CSolver *solver, CloneMap *map) {
 }
 
 void ElementFunction::updateParents() {
-       for(uint i=0;i < inputs.getSize(); i++) inputs.get(i)->parents.push(this);
+       for (uint i = 0; i < inputs.getSize(); i++) inputs.get(i)->parents.push(this);
 }
 
-Set * ElementFunction::getRange() {
+Set *ElementFunction::getRange() {
        return function->getRange();
 }
 
-void ElementSet::serialize(Serializer* serializer){
-       if(serializer->isSerialized(this))
+void ElementSet::serialize(Serializer *serializer) {
+       if (serializer->isSerialized(this))
                return;
        serializer->addObject(this);
-       
+
        set->serialize(serializer);
-       
+
        serializer->mywrite(&type, sizeof(ASTNodeType));
        ElementSet *This = this;
-       serializer->mywrite(&This, sizeof(ElementSet*));
-       serializer->mywrite(&set, sizeof(Set*));
+       serializer->mywrite(&This, sizeof(ElementSet *));
+       serializer->mywrite(&set, sizeof(Set *));
 }
 
-void ElementSet::print(){
-       model_println("{ElementSet:");
+void ElementSet::print() {
+       model_print("{ElementSet:");
        set->print();
-       model_println("}\n");
+       model_print(" %p ", this);
+       getElementEncoding()->print();
+       model_print("}");
 }
 
-void ElementConst::serialize(Serializer* serializer){
-       if(serializer->isSerialized(this))
+void ElementConst::serialize(Serializer *serializer) {
+       if (serializer->isSerialized(this))
                return;
        serializer->addObject(this);
-       
+
        set->serialize(serializer);
-       
+
        serializer->mywrite(&type, sizeof(ASTNodeType));
        ElementSet *This = this;
-       serializer->mywrite(&This, sizeof(ElementSet*));
+       serializer->mywrite(&This, sizeof(ElementSet *));
        VarType type = set->getType();
        serializer->mywrite(&type, sizeof(VarType));
        serializer->mywrite(&value, sizeof(uint64_t));
 }
 
-void ElementConst::print(){
-       model_println("{ElementConst: %lu}", value);    
+void ElementConst::print() {
+       model_print("{ElementConst: %lu}\n", value);
 }
 
-void ElementFunction::serialize(Serializer* serializer){
-       if(serializer->isSerialized(this))
+void ElementFunction::serialize(Serializer *serializer) {
+       if (serializer->isSerialized(this))
                return;
        serializer->addObject(this);
 
        function->serialize(serializer);
        uint size = inputs.getSize();
-       for(uint i=0; i<size; i++){
+       for (uint i = 0; i < size; i++) {
                Element *input = inputs.get(i);
                input->serialize(serializer);
        }
        serializeBooleanEdge(serializer, overflowstatus);
-       
+
        serializer->mywrite(&type, sizeof(ASTNodeType));
        ElementFunction *This = this;
        serializer->mywrite(&This, sizeof(ElementFunction *));
        serializer->mywrite(&function, sizeof(Function *));
        serializer->mywrite(&size, sizeof(uint));
-       for(uint i=0; i<size; i++){
-               Elementinput = inputs.get(i);
-               serializer->mywrite(&input, sizeof(Element*));
+       for (uint i = 0; i < size; i++) {
+               Element *input = inputs.get(i);
+               serializer->mywrite(&input, sizeof(Element *));
        }
-       Booleanoverflowstat = overflowstatus.getRaw();
-       serializer->mywrite(&overflowstat, sizeof(Boolean*));
+       Boolean *overflowstat = overflowstatus.getRaw();
+       serializer->mywrite(&overflowstat, sizeof(Boolean *));
 }
 
-void ElementFunction::print(){
-        model_println("{ElementFunction:");
+void ElementFunction::print() {
+       model_print("{ElementFunction:\n");
        function->print();
-        model_println("Elements:");
+       model_print("Elements:\n");
        uint size = inputs.getSize();
-       for(uint i=0; i<size; i++){
+       for (uint i = 0; i < size; i++) {
                Element *input = inputs.get(i);
                input->print();
        }
-       model_println("}\n");
+       model_print("}\n");
 }
index 1b790848518c7a146707fc9a51627051d89cef02..1e7b1f2899aaba7883573adab92c09b923ad5d79 100644 (file)
@@ -14,12 +14,12 @@ public:
        virtual ~Element() {}
        Vector<ASTNode *> parents;
        ElementEncoding encoding;
-       inline ElementEncoding *getElementEncoding(){ return &encoding; }
+       inline ElementEncoding *getElementEncoding() { return &encoding; }
        virtual Element *clone(CSolver *solver, CloneMap *map) {ASSERT(0); return NULL;};
-       virtual void serialize(Serializer* serializer) =0;
-        virtual void print() = 0;
+       virtual void serialize(Serializer *serializer) = 0;
+       virtual void print() = 0;
        virtual void updateParents() {}
-       virtual Set * getRange() = 0;
+       virtual Set *getRange() = 0;
        CMEMALLOC;
 };
 
@@ -29,11 +29,11 @@ public:
         virtual ~ElementSet(){}
        ElementSet(Set *s);
        virtual Element *clone(CSolver *solver, CloneMap *map);
-       virtual void serialize(Serializerserializer);
-        virtual void print();
+       virtual void serialize(Serializer *serializer);
+       virtual void print();
        CMEMALLOC;
        Set *getRange() {return set;}
- protected:
+protected:
        Set *set;
 
 };
@@ -43,8 +43,8 @@ public:
        ElementConst(uint64_t value, Set *_set);
         virtual ~ElementConst(){}
        uint64_t value;
-       virtual void serialize(Serializerserializer);
-        virtual void print();
+       virtual void serialize(Serializer *serializer);
+       virtual void print();
        Element *clone(CSolver *solver, CloneMap *map);
        CMEMALLOC;
 };
@@ -57,14 +57,14 @@ public:
        BooleanEdge overflowstatus;
        FunctionEncoding functionencoding;
        Element *clone(CSolver *solver, CloneMap *map);
-       virtual void serialize(Serializerserializer);
-        virtual void print();
-       Set * getRange();
+       virtual void serialize(Serializer *serializer);
+       virtual void print();
+       Set *getRange();
        void updateParents();
-       Function * getFunction() {return function;}
+       Function *getFunction() {return function;}
        inline FunctionEncoding *getElementFunctionEncoding() {return &functionencoding;}
        CMEMALLOC;
- private:
+private:
        Function *function;
 };
 
index 26decd093b1d1354d778427419db991b3407f898..c38551246ef93a5e231624a7474e202268f63d1a 100644 (file)
@@ -62,52 +62,51 @@ Function *FunctionTable::clone(CSolver *solver, CloneMap *map) {
        return f;
 }
 
-Set * FunctionTable::getRange() {
+Set *FunctionTable::getRange() {
        return table->getRange();
 }
 
-void FunctionTable::serialize(Serializer* serializer){
-       if(serializer->isSerialized(this))
+void FunctionTable::serialize(Serializer *serializer) {
+       if (serializer->isSerialized(this))
                return;
        serializer->addObject(this);
-       
+
        table->serialize(serializer);
-       
-       ASTNodeType type = FUNCTABLETYPE;       
+
+       ASTNodeType type = FUNCTABLETYPE;
        serializer->mywrite(&type, sizeof(ASTNodeType));
-       FunctionTableThis = this;
-       serializer->mywrite(&This, sizeof(FunctionTable*));
+       FunctionTable *This = this;
+       serializer->mywrite(&This, sizeof(FunctionTable *));
        serializer->mywrite(&table, sizeof(Table *));
        serializer->mywrite(&undefBehavior, sizeof(UndefinedBehavior));
-       
+
 }
 
-void FunctionTable::print(){
-       model_println("{FunctionTable:");
-        table->print();
-        model_println("}\n");
-       
+void FunctionTable::print() {
+       model_print("{FunctionTable:\n");
+       table->print();
+       model_print("}\n");
 }
 
-void FunctionOperator::serialize(Serializer* serializer){
-       if(serializer->isSerialized(this))
+void FunctionOperator::serialize(Serializer *serializer) {
+       if (serializer->isSerialized(this))
                return;
        serializer->addObject(this);
-       
+
        uint size = domains.getSize();
-       for(uint i=0; i<size; i++){
-               Setdomain = domains.get(i);
+       for (uint i = 0; i < size; i++) {
+               Set *domain = domains.get(i);
                domain->serialize(serializer);
        }
        range->serialize(serializer);
-       
-       ASTNodeType nodeType = FUNCOPTYPE; 
+
+       ASTNodeType nodeType = FUNCOPTYPE;
        serializer->mywrite(&nodeType, sizeof(ASTNodeType));
-       FunctionOperatorThis = this;
-       serializer->mywrite(&This, sizeof(FunctionOperator*));
+       FunctionOperator *This = this;
+       serializer->mywrite(&This, sizeof(FunctionOperator *));
        serializer->mywrite(&op, sizeof(ArithOp));
        serializer->mywrite(&size, sizeof(uint));
-       for(uint i=0; i<size; i++){
+       for (uint i = 0; i < size; i++) {
                Set *domain = domains.get(i);
                serializer->mywrite(&domain, sizeof(Set *));
        }
@@ -115,6 +114,6 @@ void FunctionOperator::serialize(Serializer* serializer){
        serializer->mywrite(&overflowbehavior, sizeof(OverFlowBehavior));
 }
 
-void FunctionOperator::print(){
-       model_println("{FunctionOperator: %s}", op == SATC_ADD? "ADD": "SUB" );
-}
\ No newline at end of file
+void FunctionOperator::print() {
+       model_print("{FunctionOperator: %s}\n", op == SATC_ADD ? "ADD" : "SUB" );
+}
index b8d0c78267cd22d4850b342d93a71fed303d56fd..5cfbb7d4117a5169312d5910b776b116a3aeb014 100644 (file)
@@ -12,9 +12,9 @@ public:
        FunctionType type;
        virtual ~Function() {}
        virtual Function *clone(CSolver *solver, CloneMap *map) {ASSERT(0); return NULL;}
-       virtual void serialize(Serializer* serialiezr) =0;
-        virtual void print() = 0;
-       virtual Set * getRange() = 0;
+       virtual void serialize(Serializer *serialiezr) = 0;
+       virtual void print() = 0;
+       virtual Set *getRange() = 0;
        CMEMALLOC;
 };
 
@@ -28,9 +28,9 @@ public:
        uint64_t applyFunctionOperator(uint numVals, uint64_t *values);
        bool isInRangeFunction(uint64_t val);
        Function *clone(CSolver *solver, CloneMap *map);
-       virtual void serialize(Serializerserialiezr);
-        virtual void print();
-       Set * getRange() {return range;}
+       virtual void serialize(Serializer *serialiezr);
+       virtual void print();
+       Set *getRange() {return range;}
        CMEMALLOC;
 };
 
@@ -40,9 +40,9 @@ public:
        UndefinedBehavior undefBehavior;
        FunctionTable (Table *table, UndefinedBehavior behavior);
        Function *clone(CSolver *solver, CloneMap *map);
-       virtual void serialize(Serializerserialiezr);
-        virtual void print();
-       Set * getRange();
+       virtual void serialize(Serializer *serialiezr);
+       virtual void print();
+       Set *getRange();
        CMEMALLOC;
 };
 
index 2b0dea448fc8ac1f004052ee303bac8c1c7c1056..03b368fd714d7a33978c21876f8980afe45db3d9 100644 (file)
@@ -3,7 +3,7 @@
 #include "element.h"
 #include "csolver.h"
 
-BooleanIterator::BooleanIterator(CSolver * _solver) :
+BooleanIterator::BooleanIterator(CSolver *_solver) :
        solverit(_solver->getConstraints()) {
        updateNext();
 }
@@ -21,11 +21,11 @@ void BooleanIterator::updateNext() {
                boolean.pop();
                index.pop();
        }
-       
-       while(true) {
+
+       while (true) {
                if (boolean.getSize() == 0) {
                        if (solverit->hasNext()) {
-                               Boolean *b=solverit->next().getBoolean();
+                               Boolean *b = solverit->next().getBoolean();
                                if (discovered.add(b)) {
                                        boolean.push(b);
                                        index.push(0);
@@ -34,22 +34,22 @@ void BooleanIterator::updateNext() {
                        } else
                                return;
                }
-               Boolean *topboolean=boolean.last();
-               uint topindex=index.last();
-               switch(topboolean->type) {
+               Boolean *topboolean = boolean.last();
+               uint topindex = index.last();
+               switch (topboolean->type) {
                case ORDERCONST:
                case BOOLEANVAR:
                case PREDICATEOP:
                case BOOLCONST:
                        return;
                case LOGICOP: {
-                       BooleanLogic * logicop=(BooleanLogic*) topboolean;
-                       uint size=logicop->inputs.getSize();
+                       BooleanLogic *logicop = (BooleanLogic *) topboolean;
+                       uint size = logicop->inputs.getSize();
                        if (topindex == size)
                                return;
                        index.pop();
-                       index.push(topindex+1);
-                       Boolean *newchild=logicop->inputs.get(topindex).getBoolean();
+                       index.push(topindex + 1);
+                       Boolean *newchild = logicop->inputs.get(topindex).getBoolean();
                        if (discovered.add(newchild)) {
                                boolean.push(newchild);
                                index.push(0);
@@ -62,8 +62,8 @@ void BooleanIterator::updateNext() {
        }
 }
 
-Boolean * BooleanIterator::next() {
-       Boolean * b = boolean.last();
+Boolean *BooleanIterator::next() {
+       Boolean *b = boolean.last();
        updateNext();
        return b;
 }
@@ -87,15 +87,15 @@ void ElementIterator::updateNext() {
                element.pop();
                index.pop();
        }
-       
-       while(true) {
+
+       while (true) {
                if (element.getSize() == 0) {
                        if (base != NULL) {
                                if (baseindex == base->inputs.getSize()) {
                                        base = NULL;
                                        continue;
                                } else {
-                                       Element * e = base->inputs.get(baseindex);
+                                       Element *e = base->inputs.get(baseindex);
                                        baseindex++;
                                        if (discovered.add(e)) {
                                                element.push(e);
@@ -105,30 +105,30 @@ void ElementIterator::updateNext() {
                                }
                        } else {
                                if (bit.hasNext()) {
-                                       Boolean *b=bit.next();
+                                       Boolean *b = bit.next();
                                        if (b->type == PREDICATEOP) {
                                                base = (BooleanPredicate *)b;
-                                               baseindex=0;
+                                               baseindex = 0;
                                        }
                                        continue;
                                } else
                                        return;
                        }
                }
-               Element *topelement=element.last();
-               uint topindex=index.last();
-               switch(topelement->type) {
+               Element *topelement = element.last();
+               uint topindex = index.last();
+               switch (topelement->type) {
                case ELEMSET:
                case ELEMCONST:
                        return;
                case ELEMFUNCRETURN: {
-                       ElementFunction * func=(ElementFunction*) topelement;
-                       uint size=func->inputs.getSize();
+                       ElementFunction *func = (ElementFunction *) topelement;
+                       uint size = func->inputs.getSize();
                        if (topindex == size)
                                return;
                        index.pop();
-                       index.push(topindex+1);
-                       Element *newchild=func->inputs.get(topindex);
+                       index.push(topindex + 1);
+                       Element *newchild = func->inputs.get(topindex);
                        if (discovered.add(newchild)) {
                                element.push(newchild);
                                index.push(0);
@@ -141,8 +141,8 @@ void ElementIterator::updateNext() {
        }
 }
 
-Element * ElementIterator::next() {
-       Element * e = element.last();
+Element *ElementIterator::next() {
+       Element *e = element.last();
        updateNext();
        return e;
 }
index 0e7303f7bc374481233f11cad41f2b81571c1ce8..5309934a78473948dceb536ea71a9184a548e379 100644 (file)
@@ -4,15 +4,15 @@
 #include "structs.h"
 
 class BooleanIterator {
- public:
-       BooleanIterator(CSolver * _solver);
+public:
+       BooleanIterator(CSolver *_solver);
        ~BooleanIterator();
        bool hasNext();
-       Boolean * next();
+       Boolean *next();
        CMEMALLOC;
 
- private:
-       SetIteratorBooleanEdge * solverit;
+private:
+       SetIteratorBooleanEdge *solverit;
        HashsetBoolean discovered;
        Vector<Boolean *> boolean;
        Vector<uint> index;
@@ -20,14 +20,14 @@ class BooleanIterator {
 };
 
 class ElementIterator {
- public:
+public:
        ElementIterator(CSolver *_solver);
        ~ElementIterator();
        bool hasNext();
-       Element * next();
+       Element *next();
        CMEMALLOC;
 
- private:
+private:
        BooleanIterator bit;
        BooleanPredicate *base;
        uint baseindex;
index 3d9db49b2ab6e4a117bcf1f3f4ab16e8fcb1aa20..31ce431cffb0af3eb207957564a2cf5e3b0f5026 100644 (file)
@@ -16,13 +16,13 @@ Set *MutableSet::clone(CSolver *solver, CloneMap *map) {
        s = solver->createMutableSet(type);
        for (uint i = 0; i < members->getSize(); i++) {
                ((MutableSet *)s)->addElementMSet(members->get(i));
-                               solver->addItem((MutableSet *) s, members->get(i));
+               solver->addItem((MutableSet *) s, members->get(i));
        }
-       ((MutableSet*)s)->finalize();
+       ((MutableSet *)s)->finalize();
        map->put(this, s);
        return s;
 }
 
-void MutableSet::finalize(){
+void MutableSet::finalize() {
        bsdqsort(members->expose(), members->getSize(), sizeof(uint64_t), intcompare);
 }
\ No newline at end of file
index 96e7be5f619ca7f28d971027babc5e8d2b191496..f3ccde419dc9e07957a62229a913c855aca7fdd8 100644 (file)
@@ -31,9 +31,9 @@ Order *Order::clone(CSolver *solver, CloneMap *map) {
        return o;
 }
 
-HashtableOrderPair* Order::getOrderPairTable(){
+HashtableOrderPair *Order::getOrderPairTable() {
        ASSERT( encoding.resolver != NULL);
-       if (OrderPairResolver* t = dynamic_cast<OrderPairResolver*>(encoding.resolver)){
+       if (OrderPairResolver *t = dynamic_cast<OrderPairResolver *>(encoding.resolver)) {
                return t->getOrderPairTable();
        } else {
                ASSERT(0);
@@ -46,21 +46,21 @@ Order::~Order() {
        }
 }
 
-void Order::serialize(Serializer* serializer){
-       if(serializer->isSerialized(this))
+void Order::serialize(Serializer *serializer) {
+       if (serializer->isSerialized(this))
                return;
        serializer->addObject(this);
        set->serialize(serializer);
        ASTNodeType asttype = ORDERTYPE;
        serializer->mywrite(&asttype, sizeof(ASTNodeType));
-       OrderThis = this;
-       serializer->mywrite(&This, sizeof(Order*));
+       Order *This = this;
+       serializer->mywrite(&This, sizeof(Order *));
        serializer->mywrite(&type, sizeof(OrderType));
        serializer->mywrite(&set, sizeof(Set *));
 }
 
-void Order::print(){
-       model_println("{Order on Set:");
-        set->print();
-       model_println("}\n");
+void Order::print() {
+       model_print("{Order on Set:\n");
+       set->print();
+       model_print("}\n");
 }
index e2e0b4310f9304da4bc592983d14567be2a4ef1f..866b1ab95ffa528501ce4056d10583279038273f 100644 (file)
@@ -8,7 +8,7 @@
 #include "boolean.h"
 #include "orderpair.h"
 
-class Order{
+class Order {
 public:
        Order(OrderType type, Set *set);
        virtual ~Order();
@@ -24,7 +24,7 @@ public:
        void initializeOrderElementsHashtable();
        void addOrderConstraint(BooleanOrder *constraint);
        void setOrderEncodingType(OrderEncodingType type);
-       HashtableOrderPairgetOrderPairTable();
+       HashtableOrderPair *getOrderPairTable();
        CMEMALLOC;
 };
 
index f320a4dd2b8e7162538f67d2be948f29f7404e4e..80e8a5e38e5be4aee0fad516ef9d4fb67fc0d03e 100644 (file)
@@ -51,52 +51,54 @@ Predicate *PredicateTable::clone(CSolver *solver, CloneMap *map) {
        return p;
 }
 
-void PredicateTable::serialize(Serializer* serializer){        
-       if(serializer->isSerialized(this))
+void PredicateTable::serialize(Serializer *serializer) {
+       if (serializer->isSerialized(this))
                return;
        serializer->addObject(this);
-       
+
        table->serialize(serializer);
-       
-       ASTNodeType type = PREDTABLETYPE;       
+
+       ASTNodeType type = PREDTABLETYPE;
        serializer->mywrite(&type, sizeof(ASTNodeType));
-       PredicateTableThis = this;
-       serializer->mywrite(&This, sizeof(PredicateTable*));
+       PredicateTable *This = this;
+       serializer->mywrite(&This, sizeof(PredicateTable *));
        serializer->mywrite(&table, sizeof(Table *));
        serializer->mywrite(&undefinedbehavior, sizeof(UndefinedBehavior));
 }
 
-void PredicateTable::print(){  
-       model_println("{PredicateTable:");
-        table->print();
-        model_println("}\n");
+void PredicateTable::print() {
+       model_print("{PredicateTable:\n");
+       table->print();
+       model_print("}\n");
 }
 
-void PredicateOperator::serialize(Serializer* serializer){     
-       if(serializer->isSerialized(this))
+void PredicateOperator::serialize(Serializer *serializer) {
+       if (serializer->isSerialized(this))
                return;
        serializer->addObject(this);
-       
+
        uint size = domains.getSize();
-       for(uint i=0; i<size; i++){
-               Setdomain = domains.get(i);
+       for (uint i = 0; i < size; i++) {
+               Set *domain = domains.get(i);
                domain->serialize(serializer);
        }
-               
-       ASTNodeType type = PREDOPERTYPE;        
+
+       ASTNodeType type = PREDOPERTYPE;
        serializer->mywrite(&type, sizeof(ASTNodeType));
-       PredicateOperatorThis = this;
-       serializer->mywrite(&This, sizeof(PredicateOperator*));
+       PredicateOperator *This = this;
+       serializer->mywrite(&This, sizeof(PredicateOperator *));
        serializer->mywrite(&op, sizeof(CompOp));
        serializer->mywrite(&size, sizeof(uint));
-       for(uint i=0; i<size; i++){
-               Setdomain = domains.get(i);
-               serializer->mywrite(&domain, sizeof(Set*));
+       for (uint i = 0; i < size; i++) {
+               Set *domain = domains.get(i);
+               serializer->mywrite(&domain, sizeof(Set *));
        }
 }
 
-void PredicateOperator::print(){       
-       model_println("{PredicateOperator: %s }", op ==SATC_EQUALS? "EQUAL": "NOT-EQUAL");
+void PredicateOperator::print() {
+       const char *names[] = {"==", "<", ">", "<=", ">="};
+
+       model_print("PredicateOperator: %s\n", names[(int)op]);
 }
 
 
index 94a7e2e5e25a792dcf6e20a9967b2552066da14c..812d4bda8ec4d4abb70915fb9d8ae98923b3abce 100644 (file)
@@ -12,8 +12,8 @@ public:
        Predicate(PredicateType _type) : type(_type) {}
        virtual ~Predicate() {}
        virtual Predicate *clone(CSolver *solver, CloneMap *map) {ASSERT(0); return NULL;}
-       virtual void serialize(Serializerserializer) = 0;
-        virtual void print() =0;
+       virtual void serialize(Serializer *serializer) = 0;
+       virtual void print() = 0;
        PredicateType type;
        CMEMALLOC;
 };
@@ -23,12 +23,12 @@ public:
        PredicateOperator(CompOp op, Set **domain, uint numDomain);
        bool evalPredicateOperator(uint64_t *inputs);
        Predicate *clone(CSolver *solver, CloneMap *map);
-       virtual void serialize(Serializerserializer);
-        virtual void print();
+       virtual void serialize(Serializer *serializer);
+       virtual void print();
        Array<Set *> domains;
        CompOp getOp() {return op;}
        CMEMALLOC;
- private:
+private:
        CompOp op;
 };
 
@@ -36,8 +36,8 @@ class PredicateTable : public Predicate {
 public:
        PredicateTable(Table *table, UndefinedBehavior undefBehavior);
        Predicate *clone(CSolver *solver, CloneMap *map);
-       virtual void serialize(Serializerserializer);
-        virtual void print();
+       virtual void serialize(Serializer *serializer);
+       virtual void print();
        Table *table;
        UndefinedBehavior undefinedbehavior;
        CMEMALLOC;
index c508185f99928cd2eff5d6e67c332510080e15b3..2c946d567c5458b064cf491783c19f76ea55165b 100644 (file)
@@ -6,23 +6,20 @@
 void CSolver::replaceBooleanWithTrue(BooleanEdge bexpr) {
        if (constraints.contains(bexpr.negate())) {
                constraints.remove(bexpr.negate());
-#ifdef TRACE_DEBUG
-                model_println("replaceBooleanWithTrue");
-#endif
                setUnSAT();
-       }       
+       }
        if (constraints.contains(bexpr)) {
                constraints.remove(bexpr);
        }
 
        replaceBooleanWithTrueNoRemove(bexpr);
 }
-       
+
 void CSolver::replaceBooleanWithTrueNoRemove(BooleanEdge bexpr) {
        updateMustValue(bexpr.getBoolean(), bexpr.isNegated() ? BV_MUSTBEFALSE : BV_MUSTBETRUE);
 
        ASSERT(bexpr->boolVal != BV_UNSAT);
-       
+
        uint size = bexpr->parents.getSize();
        for (uint i = 0; i < size; i++) {
                Boolean *parent = bexpr->parents.get(i);
@@ -47,8 +44,8 @@ void CSolver::replaceBooleanWithTrueNoRemove(BooleanEdge bexpr) {
 void CSolver::replaceBooleanWithBoolean(BooleanEdge oldb, BooleanEdge newb) {
        //Canonicalize
        if (oldb.isNegated()) {
-               oldb=oldb.negate();
-               newb=newb.negate();
+               oldb = oldb.negate();
+               newb = newb.negate();
 
        }
        if (constraints.contains(oldb)) {
@@ -75,8 +72,8 @@ void CSolver::replaceBooleanWithBoolean(BooleanEdge oldb, BooleanEdge newb) {
        for (uint i = 0; i < size; i++) {
                Boolean *parent = oldb->parents.get(i);
                BooleanLogic *logicop = (BooleanLogic *) parent;
-               boolMap.remove(parent); //could change parent's hash
-               
+               boolMap.remove(parent); //could change parent's hash
+
                uint parentsize = logicop->inputs.getSize();
                for (uint j = 0; j < parentsize; j++) {
                        BooleanEdge b = logicop->inputs.get(j);
@@ -111,13 +108,13 @@ void CSolver::handleIFFTrue(BooleanLogic *bexpr, BooleanEdge child) {
 }
 
 void CSolver::handleANDTrue(BooleanLogic *bexpr, BooleanEdge child) {
-       BooleanEdge childNegate=child.negate();
-       
+       BooleanEdge childNegate = child.negate();
+
        boolMap.remove(bexpr);
-       
+
        for (uint i = 0; i < bexpr->inputs.getSize(); i++) {
                BooleanEdge b = bexpr->inputs.get(i);
-               
+
                if (b == child) {
                        bexpr->inputs.remove(i);
                        i--;
@@ -127,7 +124,7 @@ void CSolver::handleANDTrue(BooleanLogic *bexpr, BooleanEdge child) {
                }
        }
 
-       uint size=bexpr->inputs.getSize();
+       uint size = bexpr->inputs.getSize();
        if (size == 0) {
                bexpr->replaced = true;
                replaceBooleanWithTrue(bexpr);
@@ -145,8 +142,8 @@ void CSolver::replaceBooleanWithFalse(BooleanEdge bexpr) {
 }
 
 BooleanEdge CSolver::doRewrite(BooleanEdge bexpr) {
-       bool isNegated=bexpr.isNegated();
-       BooleanLogic * b = (BooleanLogic *) bexpr.getBoolean();
+       bool isNegated = bexpr.isNegated();
+       BooleanLogic *b = (BooleanLogic *) bexpr.getBoolean();
        BooleanEdge result;
        if (b->op == SATC_IFF) {
                if (isTrue(b->inputs.get(0))) {
@@ -158,7 +155,7 @@ BooleanEdge CSolver::doRewrite(BooleanEdge bexpr) {
                } else if (isFalse(b->inputs.get(1))) {
                        result = b->inputs.get(0).negate();
                } else ASSERT(0);
-       } else if (b->op==SATC_AND) {
+       } else if (b->op == SATC_AND) {
                uint size = b->inputs.getSize();
                if (size == 0)
                        result = boolTrue;
index 5c07ac5ce49ef59b37a431bd19d5e613e7759daf..52494e393ca9ef682fbd5d20bce9e52041d31665 100644 (file)
@@ -5,11 +5,11 @@
 #include "qsort.h"
 
 int intcompare(const void *p1, const void *p2) {
-       uint64_t a=*(uint64_t const *) p1;
-       uint64_t b=*(uint64_t const *) p2;
+       uint64_t a = *(uint64_t const *) p1;
+       uint64_t b = *(uint64_t const *) p2;
        if (a < b)
                return -1;
-       else if (a==b)
+       else if (a == b)
                return 0;
        else
                return 1;
@@ -34,18 +34,18 @@ bool Set::exists(uint64_t element) {
                return element >= low && element <= high;
        } else {
                //Use Binary Search
-               uint low=0;
-               uint high=members->getSize()-1;
-               while(true) {
-                       uint middle=(low+high)/2;
-                       uint64_t val=members->get(middle);
+               uint low = 0;
+               uint high = members->getSize() - 1;
+               while (true) {
+                       uint middle = (low + high) / 2;
+                       uint64_t val = members->get(middle);
                        if (element < val) {
-                               high=middle-1;
-                               if (middle<=low)
+                               high = middle - 1;
+                               if (middle <= low)
                                        return false;
                        } else if (element > val) {
-                               low=middle+1;
-                               if (middle>=high)
+                               low = middle + 1;
+                               if (middle >= high)
                                        return false;
                        } else {
                                return true;
@@ -103,32 +103,40 @@ uint Set::getUnionSize(Set *s) {
        uint sum = 0;
        uint64_t sValue = s->getElement(sIndex);
        uint64_t thisValue = getElement(thisIndex);
-       while(thisIndex < thisSize && sIndex < sSize) {
+       while (thisIndex < thisSize && sIndex < sSize) {
                if (sValue < thisValue) {
-                       sValue = s->getElement(++sIndex);
+                       sIndex++;
+                       if (sIndex < sSize)
+                               sValue = s->getElement(sIndex);
                        sum++;
                } else if (thisValue < sValue) {
-                       thisValue = getElement(++thisIndex);
+                       thisIndex++;
+                       if (thisIndex < thisSize)
+                               thisValue = getElement(thisIndex);
                        sum++;
                } else {
-                       thisValue = getElement(++thisIndex);
-                       sValue = s->getElement(++sIndex);
+                       thisIndex++;
+                       sIndex++;
+                       if (sIndex < sSize)
+                               sValue = s->getElement(sIndex);
+                       if (thisIndex < thisSize)
+                               thisValue = getElement(thisIndex);
                        sum++;
                }
        }
        sum += (thisSize - thisIndex) + (sSize - sIndex);
-       
+
        return sum;
 }
 
-void Set::serialize(Serializer* serializer){
-       if(serializer->isSerialized(this))
+void Set::serialize(Serializer *serializer) {
+       if (serializer->isSerialized(this))
                return;
        serializer->addObject(this);
        ASTNodeType asttype = SETTYPE;
        serializer->mywrite(&asttype, sizeof(ASTNodeType));
-       SetThis = this;
-       serializer->mywrite(&This, sizeof(Set*));
+       Set *This = this;
+       serializer->mywrite(&This, sizeof(Set *));
        serializer->mywrite(&type, sizeof(VarType));
        serializer->mywrite(&isRange, sizeof(bool));
         bool isMutable = isMutableSet();
@@ -146,17 +154,17 @@ void Set::serialize(Serializer* serializer){
         }
 }
 
-void Set::print(){
+void Set::print() {
        model_print("{Set:");
-        if(isRange){
-                model_print("Range: low=%lu, high=%lu}\n\n", low, high);
-        } else {
-                uint size = members->getSize();
-                model_print("Members: ");
-                for(uint i=0; i<size; i++){
-                        uint64_t mem = members->get(i);
-                        model_print("%lu, ", mem);
-                }
-                model_println("}\n");
-        }
+       if (isRange) {
+               model_print("Range: low=%lu, high=%lu}", low, high);
+       } else {
+               uint size = members->getSize();
+               model_print("Members: ");
+               for (uint i = 0; i < size; i++) {
+                       uint64_t mem = members->get(i);
+                       model_print("%lu, ", mem);
+               }
+               model_print("}");
+       }
 }
index a0bd449e5b831535e432eb6bca85634ea132ea48..c647af536773c4434975455dd8ea0d3828508c95 100644 (file)
@@ -27,7 +27,7 @@ public:
        uint getUnionSize(Set *s);
        virtual bool isMutableSet() {return false;}
        virtual Set *clone(CSolver *solver, CloneMap *map);
-       virtual void serialize(Serializerserializer);
+       virtual void serialize(Serializer *serializer);
        virtual void print();
        CMEMALLOC;
 protected:
index f6494f479c17880e8b16d71979d0041d1c60c325..5786b173d2499ebe9dc499630343aeaf46723da0 100644 (file)
@@ -61,34 +61,34 @@ Table::~Table() {
 
 
 
-void Table::serialize(Serializer* serializer){
-       if(serializer->isSerialized(this))
+void Table::serialize(Serializer *serializer) {
+       if (serializer->isSerialized(this))
                return;
        serializer->addObject(this);
-       
+
        uint size = domains.getSize();
-       for(uint i=0; i<size; i++){
-               Setdomain = domains.get(i);
+       for (uint i = 0; i < size; i++) {
+               Set *domain = domains.get(i);
                domain->serialize(serializer);
        }
-       if(range!= NULL)
+       if (range != NULL)
                range->serialize(serializer);
-       
-       ASTNodeType type = TABLETYPE;   
+
+       ASTNodeType type = TABLETYPE;
        serializer->mywrite(&type, sizeof(ASTNodeType));
-       TableThis = this;
-       serializer->mywrite(&This, sizeof(Table*));
+       Table *This = this;
+       serializer->mywrite(&This, sizeof(Table *));
        serializer->mywrite(&size, sizeof(uint));
-       for(uint i=0; i<size; i++){
-               Setdomain = domains.get(i);
-               serializer->mywrite(&domain, sizeof(Set*));
+       for (uint i = 0; i < size; i++) {
+               Set *domain = domains.get(i);
+               serializer->mywrite(&domain, sizeof(Set *));
        }
-       serializer->mywrite(&range, sizeof(Set*));
+       serializer->mywrite(&range, sizeof(Set *));
        size = entries->getSize();
        serializer->mywrite(&size, sizeof(uint));
-       SetIteratorTableEntryiterator = getEntries();
-       while(iterator->hasNext()){
-               TableEntryentry = iterator->next();
+       SetIteratorTableEntry *iterator = getEntries();
+       while (iterator->hasNext()) {
+               TableEntry *entry = iterator->next();
                serializer->mywrite(&entry->output, sizeof(uint64_t));
                serializer->mywrite(&entry->inputSize, sizeof(uint));
                serializer->mywrite(entry->inputs, sizeof(uint64_t) * entry->inputSize);
@@ -97,17 +97,17 @@ void Table::serialize(Serializer* serializer){
 }
 
 
-void Table::print(){
-        model_println("{Table:");
-       SetIteratorTableEntryiterator = getEntries();
-       while(iterator->hasNext()){
-               TableEntryentry = iterator->next();
-                model_print("<");
-                for(uint i=0; i<entry->inputSize; i++){
-                        model_print("%lu, ", entry->inputs[i]);
-                }
-                model_print(" == %lu>", entry->output);
+void Table::print() {
+       model_print("{Table:\n");
+       SetIteratorTableEntry *iterator = getEntries();
+       while (iterator->hasNext()) {
+               TableEntry *entry = iterator->next();
+               model_print("<");
+               for (uint i = 0; i < entry->inputSize; i++) {
+                       model_print("%lu, ", entry->inputs[i]);
+               }
+               model_print(" == %lu>", entry->output);
        }
-        model_println("}\n");
+       model_print("}\n");
        delete iterator;
 }
index d8c7829b86eb8e4dd60b9732d6fc7968485f5a44..c196d3cf0801db83449123b45905663ba7e1b80d 100644 (file)
@@ -11,19 +11,19 @@ public:
        TableEntry *getTableEntry(uint64_t *inputs, uint inputSize);
        Table *clone(CSolver *solver, CloneMap *map);
        void serialize(Serializer *serializer);
-        void print();
+       void print();
        ~Table();
-       Set * getRange() {return range;}
-       
-       Set * getDomain(uint i) {return domains.get(i);}
+       Set *getRange() {return range;}
+
+       Set *getDomain(uint i) {return domains.get(i);}
        uint numDomains() {return domains.getSize();}
-       SetIteratorTableEntry * getEntries() {return entries->iterator();}
+
+       SetIteratorTableEntry *getEntries() {return entries->iterator();}
        uint getSize() {return entries->getSize();}
 
        CMEMALLOC;
-       
- private:
+
+private:
        Array<Set *> domains;
        Set *range;
        HashsetTableEntry *entries;
index ebe6d7a90049f9773f3c9debad2be8b9238bb7c9..5c758c3e0ad3eb63dcdd920435953ecc476291d2 100644 (file)
 #include "subgraph.h"
 #include "elementencoding.h"
 
-EncodingGraph::EncodingGraph(CSolver * _solver) :
+EncodingGraph::EncodingGraph(CSolver *_solver) :
        solver(_solver) {
 }
 
-int sortEncodingEdge(const void * p1, const void *p2) {
-       const EncodingEdge * e1 = * (const EncodingEdge **) p1;
-       const EncodingEdge * e2 = * (const EncodingEdge **) p2;
+EncodingGraph::~EncodingGraph() {
+       subgraphs.resetAndDelete();
+       encodingMap.resetAndDeleteVals();
+       edgeMap.resetAndDeleteVals();
+}
+
+int sortEncodingEdge(const void *p1, const void *p2) {
+       const EncodingEdge *e1 = *(const EncodingEdge **) p1;
+       const EncodingEdge *e2 = *(const EncodingEdge **) p2;
        uint64_t v1 = e1->getValue();
        uint64_t v2 = e2->getValue();
        if (v1 < v2)
@@ -29,9 +35,9 @@ int sortEncodingEdge(const void * p1, const void *p2) {
 
 void EncodingGraph::buildGraph() {
        ElementIterator it(solver);
-       while(it.hasNext()) {
-               Element * e = it.next();
-               switch(e->type) {
+       while (it.hasNext()) {
+               Element *e = it.next();
+               switch (e->type) {
                case ELEMSET:
                case ELEMFUNCRETURN:
                        processElement(e);
@@ -47,40 +53,40 @@ void EncodingGraph::buildGraph() {
 }
 
 void EncodingGraph::encode() {
-       SetIteratorEncodingSubGraph * itesg=subgraphs.iterator();
-       while(itesg->hasNext()) {
-               EncodingSubGraph *sg=itesg->next();
+       SetIteratorEncodingSubGraph *itesg = subgraphs.iterator();
+       while (itesg->hasNext()) {
+               EncodingSubGraph *sg = itesg->next();
                sg->encode();
        }
        delete itesg;
 
        ElementIterator it(solver);
-       while(it.hasNext()) {
-               Element * e = it.next();
-               switch(e->type) {
+       while (it.hasNext()) {
+               Element *e = it.next();
+               switch (e->type) {
                case ELEMSET:
                case ELEMFUNCRETURN: {
-                       ElementEncoding *encoding=e->getElementEncoding();
+                       ElementEncoding *encoding = e->getElementEncoding();
                        if (encoding->getElementEncodingType() == ELEM_UNASSIGNED) {
                                EncodingNode *n = getNode(e);
                                if (n == NULL)
                                        continue;
-                               ElementEncodingType encodetype=n->getEncoding();
+                               ElementEncodingType encodetype = n->getEncoding();
                                encoding->setElementEncodingType(encodetype);
                                if (encodetype == UNARY || encodetype == ONEHOT) {
                                        encoding->encodingArrayInitialization();
                                } else if (encodetype == BINARYINDEX) {
-                                       EncodingSubGraph * subgraph = graphMap.get(n);
+                                       EncodingSubGraph *subgraph = graphMap.get(n);
                                        if (subgraph == NULL)
                                                continue;
-                                       uint encodingSize = subgraph->getEncodingSize(n);
+                                       uint encodingSize = subgraph->getEncodingMaxVal(n) + 1;
                                        uint paddedSize = encoding->getSizeEncodingArray(encodingSize);
                                        encoding->allocInUseArrayElement(paddedSize);
                                        encoding->allocEncodingArrayElement(paddedSize);
-                                       Set * s=e->getRange();
-                                       for(uint i=0;i<s->getSize();i++) {
-                                               uint64_t value=s->getElement(i);
-                                               uint encodingIndex=subgraph->getEncoding(n, value);
+                                       Set *s = e->getRange();
+                                       for (uint i = 0; i < s->getSize(); i++) {
+                                               uint64_t value = s->getElement(i);
+                                               uint encodingIndex = subgraph->getEncoding(n, value);
                                                encoding->setInUseElement(encodingIndex);
                                                encoding->encodingArray[encodingIndex] = value;
                                        }
@@ -96,23 +102,23 @@ void EncodingGraph::encode() {
 }
 
 void EncodingGraph::encodeParent(Element *e) {
-       uint size=e->parents.getSize();
-       for(uint i=0;i<size;i++) {
-               ASTNode * n = e->parents.get(i);
-               if (n->type==PREDICATEOP) {
-                       BooleanPredicate *b=(BooleanPredicate *)n;
-                       FunctionEncoding *fenc=b->getFunctionEncoding();
+       uint size = e->parents.getSize();
+       for (uint i = 0; i < size; i++) {
+               ASTNode *n = e->parents.get(i);
+               if (n->type == PREDICATEOP) {
+                       BooleanPredicate *b = (BooleanPredicate *)n;
+                       FunctionEncoding *fenc = b->getFunctionEncoding();
                        if (fenc->getFunctionEncodingType() != FUNC_UNASSIGNED)
                                continue;
-                       Predicate *p=b->getPredicate();
-                       if (p->type==OPERATORPRED) {
-                               PredicateOperator *po=(PredicateOperator *)p;
-                               ASSERT(b->inputs.getSize()==2);
-                               EncodingNode *left=createNode(b->inputs.get(0));
-                               EncodingNode *right=createNode(b->inputs.get(1));
+                       Predicate *p = b->getPredicate();
+                       if (p->type == OPERATORPRED) {
+                               PredicateOperator *po = (PredicateOperator *)p;
+                               ASSERT(b->inputs.getSize() == 2);
+                               EncodingNode *left = createNode(b->inputs.get(0));
+                               EncodingNode *right = createNode(b->inputs.get(1));
                                if (left == NULL || right == NULL)
                                        return;
-                               EncodingEdge *edge=getEdge(left, right, NULL);
+                               EncodingEdge *edge = getEdge(left, right, NULL);
                                if (edge != NULL && edge->getEncoding() == EDGE_MATCH) {
                                        fenc->setFunctionEncodingType(CIRCUIT);
                                }
@@ -122,8 +128,8 @@ void EncodingGraph::encodeParent(Element *e) {
 }
 
 void EncodingGraph::mergeNodes(EncodingNode *first, EncodingNode *second) {
-       EncodingSubGraph *graph1=graphMap.get(first);
-       EncodingSubGraph *graph2=graphMap.get(second);
+       EncodingSubGraph *graph1 = graphMap.get(first);
+       EncodingSubGraph *graph2 = graphMap.get(second);
        if (graph1 == NULL)
                first->setEncoding(BINARYINDEX);
        if (graph2 == NULL)
@@ -143,9 +149,9 @@ void EncodingGraph::mergeNodes(EncodingNode *first, EncodingNode *second) {
                first = tmp;
        }
        if (graph1 != NULL && graph2 != NULL) {
-               SetIteratorEncodingNode * nodeit=graph2->nodeIterator();
-               while(nodeit->hasNext()) {
-                       EncodingNode *node=nodeit->next();
+               SetIteratorEncodingNode *nodeit = graph2->nodeIterator();
+               while (nodeit->hasNext()) {
+                       EncodingNode *node = nodeit->next();
                        graph1->addNode(node);
                        graphMap.put(node, graph1);
                }
@@ -160,10 +166,10 @@ void EncodingGraph::mergeNodes(EncodingNode *first, EncodingNode *second) {
 }
 
 void EncodingGraph::processElement(Element *e) {
-       uint size=e->parents.getSize();
-       for(uint i=0;i<size;i++) {
-               ASTNode * n = e->parents.get(i);
-               switch(n->type) {
+       uint size = e->parents.getSize();
+       for (uint i = 0; i < size; i++) {
+               ASTNode *n = e->parents.get(i);
+               switch (n->type) {
                case PREDICATEOP:
                        processPredicate((BooleanPredicate *)n);
                        break;
@@ -177,32 +183,32 @@ void EncodingGraph::processElement(Element *e) {
 }
 
 void EncodingGraph::processFunction(ElementFunction *ef) {
-       Function *f=ef->getFunction();
-       if (f->type==OPERATORFUNC) {
-               FunctionOperator *fo=(FunctionOperator*)f;
+       Function *f = ef->getFunction();
+       if (f->type == OPERATORFUNC) {
+               FunctionOperator *fo = (FunctionOperator *)f;
                ASSERT(ef->inputs.getSize() == 2);
-               EncodingNode *left=createNode(ef->inputs.get(0));
-               EncodingNode *right=createNode(ef->inputs.get(1));
+               EncodingNode *left = createNode(ef->inputs.get(0));
+               EncodingNode *right = createNode(ef->inputs.get(1));
                if (left == NULL && right == NULL)
                        return;
-               EncodingNode *dst=createNode(ef);
-               EncodingEdge *edge=createEdge(left, right, dst);
+               EncodingNode *dst = createNode(ef);
+               EncodingEdge *edge = createEdge(left, right, dst);
                edge->numArithOps++;
        }
 }
 
 void EncodingGraph::processPredicate(BooleanPredicate *b) {
-       Predicate *p=b->getPredicate();
-       if (p->type==OPERATORPRED) {
-               PredicateOperator *po=(PredicateOperator *)p;
-               ASSERT(b->inputs.getSize()==2);
-               EncodingNode *left=createNode(b->inputs.get(0));
-               EncodingNode *right=createNode(b->inputs.get(1));
+       Predicate *p = b->getPredicate();
+       if (p->type == OPERATORPRED) {
+               PredicateOperator *po = (PredicateOperator *)p;
+               ASSERT(b->inputs.getSize() == 2);
+               EncodingNode *left = createNode(b->inputs.get(0));
+               EncodingNode *right = createNode(b->inputs.get(1));
                if (left == NULL || right == NULL)
                        return;
-               EncodingEdge *edge=createEdge(left, right, NULL);
-               CompOp op=po->getOp();
-               switch(op) {
+               EncodingEdge *edge = createEdge(left, right, NULL);
+               CompOp op = po->getOp();
+               switch (op) {
                case SATC_EQUALS:
                        edge->numEquals++;
                        break;
@@ -219,60 +225,60 @@ void EncodingGraph::processPredicate(BooleanPredicate *b) {
 }
 
 uint convertSize(uint cost) {
-       cost = 1.2 * cost; // fudge factor
+       cost = 1.2 * cost;// fudge factor
        return NEXTPOW2(cost);
 }
 
 void EncodingGraph::decideEdges() {
-       uint size=edgeVector.getSize();
-       for(uint i=0; i<size; i++) {
+       uint size = edgeVector.getSize();
+       for (uint i = 0; i < size; i++) {
                EncodingEdge *ee = edgeVector.get(i);
                EncodingNode *left = ee->left;
                EncodingNode *right = ee->right;
-               
+
                if (ee->encoding != EDGE_UNASSIGNED ||
                                !left->couldBeBinaryIndex() ||
                                !right->couldBeBinaryIndex())
                        continue;
-               
+
                uint64_t eeValue = ee->getValue();
                if (eeValue == 0)
                        return;
 
                EncodingSubGraph *leftGraph = graphMap.get(left);
                EncodingSubGraph *rightGraph = graphMap.get(right);
-               if (leftGraph == NULL && rightGraph !=NULL) {
-                       EncodingNode *tmp = left; left=right; right=tmp;
+               if (leftGraph == NULL && rightGraph != NULL) {
+                       EncodingNode *tmp = left; left = right; right = tmp;
                        EncodingSubGraph *tmpsg = leftGraph; leftGraph = rightGraph; rightGraph = tmpsg;
                }
 
-               uint leftSize=0, rightSize=0, newSize=0;
-               uint64_t totalCost=0;
+               uint leftSize = 0, rightSize = 0, newSize = 0;
+               uint64_t totalCost = 0;
                if (leftGraph == NULL && rightGraph == NULL) {
-                       leftSize=convertSize(left->getSize());
-                       rightSize=convertSize(right->getSize());
-                       newSize=convertSize(left->s->getUnionSize(right->s));
-                       newSize=(leftSize > newSize) ? leftSize: newSize;
-                       newSize=(rightSize > newSize) ? rightSize: newSize;
+                       leftSize = convertSize(left->getSize());
+                       rightSize = convertSize(right->getSize());
+                       newSize = convertSize(left->s->getUnionSize(right->s));
+                       newSize = (leftSize > newSize) ? leftSize : newSize;
+                       newSize = (rightSize > newSize) ? rightSize : newSize;
                        totalCost = (newSize - leftSize) * left->elements.getSize() +
-                               (newSize - rightSize) * right->elements.getSize();
+                                                                       (newSize - rightSize) * right->elements.getSize();
                } else if (leftGraph != NULL && rightGraph == NULL) {
-                       leftSize=convertSize(leftGraph->encodingSize);
-                       rightSize=convertSize(right->getSize());
-                       newSize=convertSize(leftGraph->estimateNewSize(right));
-                       newSize=(leftSize > newSize) ? leftSize: newSize;
-                       newSize=(rightSize > newSize) ? rightSize: newSize;
+                       leftSize = convertSize(leftGraph->encodingSize);
+                       rightSize = convertSize(right->getSize());
+                       newSize = convertSize(leftGraph->estimateNewSize(right));
+                       newSize = (leftSize > newSize) ? leftSize : newSize;
+                       newSize = (rightSize > newSize) ? rightSize : newSize;
                        totalCost = (newSize - leftSize) * leftGraph->numElements +
-                               (newSize - rightSize) * right->elements.getSize();
+                                                                       (newSize - rightSize) * right->elements.getSize();
                } else {
                        //Neither are null
-                       leftSize=convertSize(leftGraph->encodingSize);
-                       rightSize=convertSize(rightGraph->encodingSize);
-                       newSize=convertSize(leftGraph->estimateNewSize(rightGraph));
-                       newSize=(leftSize > newSize) ? leftSize: newSize;
-                       newSize=(rightSize > newSize) ? rightSize: newSize;
+                       leftSize = convertSize(leftGraph->encodingSize);
+                       rightSize = convertSize(rightGraph->encodingSize);
+                       newSize = convertSize(leftGraph->estimateNewSize(rightGraph));
+                       newSize = (leftSize > newSize) ? leftSize : newSize;
+                       newSize = (rightSize > newSize) ? rightSize : newSize;
                        totalCost = (newSize - leftSize) * leftGraph->numElements +
-                               (newSize - rightSize) * rightGraph->numElements;
+                                                                       (newSize - rightSize) * rightGraph->numElements;
                }
                double conversionfactor = 0.5;
                if ((totalCost * conversionfactor) < eeValue) {
@@ -284,28 +290,28 @@ void EncodingGraph::decideEdges() {
 
 static TunableDesc EdgeEncodingDesc(EDGE_UNASSIGNED, EDGE_MATCH, EDGE_UNASSIGNED);
 
-EncodingEdge * EncodingGraph::getEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst) {
+EncodingEdge *EncodingGraph::getEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst) {
        EncodingEdge e(left, right, dst);
        EncodingEdge *result = edgeMap.get(&e);
        return result;
 }
 
-EncodingEdge * EncodingGraph::createEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst) {
+EncodingEdge *EncodingGraph::createEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst) {
        EncodingEdge e(left, right, dst);
        EncodingEdge *result = edgeMap.get(&e);
        if (result == NULL) {
-               result=new EncodingEdge(left, right, dst);
-               VarType v1=left->getType();
-               VarType v2=right->getType();
+               result = new EncodingEdge(left, right, dst);
+               VarType v1 = left->getType();
+               VarType v2 = right->getType();
                if (v1 > v2) {
-                       VarType tmp=v2;
-                       v2=v1;
-                       v1=tmp;
+                       VarType tmp = v2;
+                       v2 = v1;
+                       v1 = tmp;
                }
 
                if ((left != NULL && left->couldBeBinaryIndex()) &&
                                (right != NULL) && right->couldBeBinaryIndex()) {
-                       EdgeEncodingType type=(EdgeEncodingType)solver->getTuner()->getVarTunable(v1, v2, EDGEENCODING, &EdgeEncodingDesc);
+                       EdgeEncodingType type = (EdgeEncodingType)solver->getTuner()->getVarTunable(v1, v2, EDGEENCODING, &EdgeEncodingDesc);
                        result->setEncoding(type);
                        if (type == EDGE_MATCH) {
                                mergeNodes(left, right);
@@ -337,7 +343,7 @@ VarType EncodingNode::getType() const {
 
 static TunableDesc NodeEncodingDesc(ELEM_UNASSIGNED, BINARYINDEX, ELEM_UNASSIGNED);
 
-EncodingNode * EncodingGraph::createNode(Element *e) {
+EncodingNode *EncodingGraph::createNode(Element *e) {
        if (e->type == ELEMCONST)
                return NULL;
        Set *s = e->getRange();
@@ -345,14 +351,14 @@ EncodingNode * EncodingGraph::createNode(Element *e) {
        if (n == NULL) {
                n = new EncodingNode(s);
                n->setEncoding((ElementEncodingType)solver->getTuner()->getVarTunable(n->getType(), NODEENCODING, &NodeEncodingDesc));
-               
+
                encodingMap.put(s, n);
        }
        n->addElement(e);
        return n;
 }
 
-EncodingNode * EncodingGraph::getNode(Element *e) {
+EncodingNode *EncodingGraph::getNode(Element *e) {
        if (e->type == ELEMCONST)
                return NULL;
        Set *s = e->getRange();
@@ -387,7 +393,7 @@ EncodingEdge::EncodingEdge(EncodingNode *_left, EncodingNode *_right, EncodingNo
 }
 
 uint hashEncodingEdge(EncodingEdge *edge) {
-       uintptr_t hash=(((uintptr_t) edge->left) >> 2) ^ (((uintptr_t)edge->right) >> 4) ^ (((uintptr_t)edge->dst) >> 6);
+       uintptr_t hash = (((uintptr_t) edge->left) >> 2) ^ (((uintptr_t)edge->right) >> 4) ^ (((uintptr_t)edge->dst) >> 6);
        return (uint) hash;
 }
 
index 301a74ab0bf8db0f4e2e9f54eded6c7f67c8b279..ab9cac6cc3621e5d1f340cac4e95305c807f390a 100644 (file)
@@ -5,44 +5,45 @@
 #include "graphstructs.h"
 
 class EncodingGraph {
- public:
-       EncodingGraph(CSolver * solver);
+public:
+       EncodingGraph(CSolver *solver);
+       ~EncodingGraph();
        void buildGraph();
        void encode();
-       
+
        CMEMALLOC;
- private:
-       CSolver * solver;
+private:
+       CSolver *solver;
        HashtableEncoding encodingMap;
        HashtableEdge edgeMap;
        Vector<EncodingEdge *> edgeVector;
        HashsetElement discovered;
        HashtableNodeToSubGraph graphMap;
        HashsetEncodingSubGraph subgraphs;
-       
+
        void encodeParent(Element *e);
        void decideEdges();
        void mergeNodes(EncodingNode *first, EncodingNode *second);
        void processElement(Element *e);
        void processFunction(ElementFunction *f);
        void processPredicate(BooleanPredicate *b);
-       EncodingNode * createNode(Element *e);
-       EncodingNode * getNode(Element *e);
-       EncodingEdge * getEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst);
-       EncodingEdge * createEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst);
+       EncodingNode *createNode(Element *e);
+       EncodingNode *getNode(Element *e);
+       EncodingEdge *getEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst);
+       EncodingEdge *createEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst);
 };
 
 class EncodingNode {
- public:
+public:
        EncodingNode(Set *_s);
        void addElement(Element *e);
        uint getSize() const;
        VarType getType() const;
-       void setEncoding(ElementEncodingType e) {encoding=e;}
+       void setEncoding(ElementEncodingType e) {encoding = e;}
        ElementEncodingType getEncoding() {return encoding;}
        bool couldBeBinaryIndex() {return encoding == BINARYINDEX || encoding == ELEM_UNASSIGNED;}
        CMEMALLOC;
- private:
+private:
        Set *s;
        HashsetElement elements;
        HashsetEncodingEdge edges;
@@ -55,16 +56,16 @@ enum EdgeEncodingType { EDGE_UNASSIGNED, EDGE_BREAK, EDGE_MATCH};
 typedef enum EdgeEncodingType EdgeEncodingType;
 
 class EncodingEdge {
- public:
+public:
        EncodingEdge(EncodingNode *_l, EncodingNode *_r);
        EncodingEdge(EncodingNode *_l, EncodingNode *_r, EncodingNode *_d);
-       void setEncoding(EdgeEncodingType e) {encoding=e;}
+       void setEncoding(EdgeEncodingType e) {encoding = e;}
        uint64_t getValue() const;
        EdgeEncodingType getEncoding() {return encoding;}
 
        CMEMALLOC;
-       
- private:
+
+private:
        EncodingNode *left;
        EncodingNode *right;
        EncodingNode *dst;
index afddea10ebe0d9dda337f89188a045e48149d302..86937549fe578070a78914c0a27f9e9307e08b16 100644 (file)
@@ -9,6 +9,11 @@ EncodingSubGraph::EncodingSubGraph() :
        maxEncodingVal(0) {
 }
 
+EncodingSubGraph::~EncodingSubGraph() {
+       map.resetAndDeleteKeys();
+       values.resetAndDelete();
+}
+
 uint hashNodeValuePair(NodeValuePair *nvp) {
        return (uint) (nvp->value ^ ((uintptr_t)nvp->node));
 }
@@ -18,10 +23,10 @@ bool equalsNodeValuePair(NodeValuePair *nvp1, NodeValuePair *nvp2) {
 }
 
 int sortEncodingValue(const void *p1, const void *p2) {
-       const EncodingValue * e1 = * (const EncodingValue **) p1;
-       const EncodingValue * e2 = * (const EncodingValue **) p2;
-       uint se1=e1->notequals.getSize();
-       uint se2=e2->notequals.getSize();
+       const EncodingValue *e1 = *(const EncodingValue **) p1;
+       const EncodingValue *e2 = *(const EncodingValue **) p2;
+       uint se1 = e1->notequals.getSize();
+       uint se2 = e2->notequals.getSize();
        if (se1 > se2)
                return -1;
        else if (se2 == se1)
@@ -39,9 +44,9 @@ uint EncodingSubGraph::getEncoding(EncodingNode *n, uint64_t val) {
 void EncodingSubGraph::solveEquals() {
        Vector<EncodingValue *> toEncode;
        Vector<bool> encodingArray;
-       SetIteratorEncodingValue *valIt=values.iterator();
-       while(valIt->hasNext()) {
-               EncodingValue *ev=valIt->next();
+       SetIteratorEncodingValue *valIt = values.iterator();
+       while (valIt->hasNext()) {
+               EncodingValue *ev = valIt->next();
                if (!ev->inComparison)
                        toEncode.push(ev);
                else
@@ -49,20 +54,20 @@ void EncodingSubGraph::solveEquals() {
        }
        delete valIt;
        bsdqsort(toEncode.expose(), toEncode.getSize(), sizeof(EncodingValue *), sortEncodingValue);
-       uint toEncodeSize=toEncode.getSize();
-       for(uint i=0; i<toEncodeSize; i++) {
-               EncodingValue * ev=toEncode.get(i);
+       uint toEncodeSize = toEncode.getSize();
+       for (uint i = 0; i < toEncodeSize; i++) {
+               EncodingValue *ev = toEncode.get(i);
                encodingArray.clear();
-               SetIteratorEncodingValue *conflictIt=ev->notequals.iterator();
-               while(conflictIt->hasNext()) {
-                       EncodingValue * conflict=conflictIt->next();
+               SetIteratorEncodingValue *conflictIt = ev->notequals.iterator();
+               while (conflictIt->hasNext()) {
+                       EncodingValue *conflict = conflictIt->next();
                        if (conflict->assigned) {
                                encodingArray.setExpand(conflict->encoding, true);
                        }
                }
                delete conflictIt;
-               uint encoding=0;
-               for(;encoding<encodingArray.getSize();encoding++) {
+               uint encoding = 0;
+               for (; encoding < encodingArray.getSize(); encoding++) {
                        //See if this is unassigned
                        if (!encodingArray.get(encoding))
                                break;
@@ -77,17 +82,17 @@ void EncodingSubGraph::solveEquals() {
 void EncodingSubGraph::solveComparisons() {
        HashsetEncodingValue discovered;
        Vector<EncodingValue *> tovisit;
-       SetIteratorEncodingValue *valIt=values.iterator();
-       while(valIt->hasNext()) {
-               EncodingValue *ev=valIt->next();
+       SetIteratorEncodingValue *valIt = values.iterator();
+       while (valIt->hasNext()) {
+               EncodingValue *ev = valIt->next();
                if (discovered.add(ev)) {
                        tovisit.push(ev);
-                       while(tovisit.getSize()!=0) {
-                               EncodingValue * val=tovisit.last(); tovisit.pop();
-                               SetIteratorEncodingValue *nextIt=val->larger.iterator();
+                       while (tovisit.getSize() != 0) {
+                               EncodingValue *val = tovisit.last(); tovisit.pop();
+                               SetIteratorEncodingValue *nextIt = val->larger.iterator();
                                uint minVal = val->encoding + 1;
-                               while(nextIt->hasNext()) {
-                                       EncodingValue *nextVal=nextIt->next();
+                               while (nextIt->hasNext()) {
+                                       EncodingValue *nextVal = nextIt->next();
                                        if (nextVal->encoding < minVal) {
                                                if (minVal > maxEncodingVal)
                                                        maxEncodingVal = minVal;
@@ -104,11 +109,11 @@ void EncodingSubGraph::solveComparisons() {
 }
 
 uint EncodingSubGraph::estimateNewSize(EncodingSubGraph *sg) {
-       uint newSize=0;
-       SetIteratorEncodingNode * nit = sg->nodes.iterator();
-       while(nit->hasNext()) {
+       uint newSize = 0;
+       SetIteratorEncodingNode *nit = sg->nodes.iterator();
+       while (nit->hasNext()) {
                EncodingNode *en = nit->next();
-               uint size=estimateNewSize(en);
+               uint size = estimateNewSize(en);
                if (size > newSize)
                        newSize = size;
        }
@@ -117,10 +122,10 @@ uint EncodingSubGraph::estimateNewSize(EncodingSubGraph *sg) {
 }
 
 uint EncodingSubGraph::estimateNewSize(EncodingNode *n) {
-       SetIteratorEncodingEdge * eeit = n->edges.iterator();
-       uint newsize=n->getSize();
-       while(eeit->hasNext()) {
-               EncodingEdge * ee = eeit->next();
+       SetIteratorEncodingEdge *eeit = n->edges.iterator();
+       uint newsize = n->getSize();
+       while (eeit->hasNext()) {
+               EncodingEdge *ee = eeit->next();
                if (ee->left != NULL && ee->left != n && nodes.contains(ee->left)) {
                        uint intersectSize = n->s->getUnionSize(ee->left->s);
                        if (intersectSize > newsize)
@@ -143,13 +148,13 @@ uint EncodingSubGraph::estimateNewSize(EncodingNode *n) {
 
 void EncodingSubGraph::addNode(EncodingNode *n) {
        nodes.add(n);
-       uint newSize=estimateNewSize(n);
+       uint newSize = estimateNewSize(n);
        numElements += n->elements.getSize();
        if (newSize > encodingSize)
-               encodingSize=newSize;
+               encodingSize = newSize;
 }
 
-SetIteratorEncodingNode * EncodingSubGraph::nodeIterator() {
+SetIteratorEncodingNode *EncodingSubGraph::nodeIterator() {
        return nodes.iterator();
 }
 
@@ -162,14 +167,14 @@ void EncodingSubGraph::encode() {
 }
 
 void EncodingSubGraph::computeEqualities() {
-       SetIteratorEncodingNode *nodeit=nodes.iterator();
-       while(nodeit->hasNext()) {
-               EncodingNode *node=nodeit->next();
+       SetIteratorEncodingNode *nodeit = nodes.iterator();
+       while (nodeit->hasNext()) {
+               EncodingNode *node = nodeit->next();
                generateEquals(node, node);
-               
-               SetIteratorEncodingEdge *edgeit=node->edges.iterator();
-               while(edgeit->hasNext()) {
-                       EncodingEdge *edge=edgeit->next();
+
+               SetIteratorEncodingEdge *edgeit = node->edges.iterator();
+               while (edgeit->hasNext()) {
+                       EncodingEdge *edge = edgeit->next();
                        //skip over comparisons as we have already handled them
                        if (edge->numComparisons != 0)
                                continue;
@@ -194,12 +199,12 @@ void EncodingSubGraph::computeEqualities() {
 }
 
 void EncodingSubGraph::computeComparisons() {
-       SetIteratorEncodingNode *nodeit=nodes.iterator();
-       while(nodeit->hasNext()) {
-               EncodingNode *node=nodeit->next();
-               SetIteratorEncodingEdge *edgeit=node->edges.iterator();
-               while(edgeit->hasNext()) {
-                       EncodingEdge *edge=edgeit->next();
+       SetIteratorEncodingNode *nodeit = nodes.iterator();
+       while (nodeit->hasNext()) {
+               EncodingNode *node = nodeit->next();
+               SetIteratorEncodingEdge *edgeit = node->edges.iterator();
+               while (edgeit->hasNext()) {
+                       EncodingEdge *edge = edgeit->next();
                        if (edge->numComparisons == 0)
                                continue;
                        if (edge->left == NULL || !nodes.contains(edge->left))
@@ -222,15 +227,15 @@ void EncodingSubGraph::orderEV(EncodingValue *earlier, EncodingValue *later) {
 }
 
 void EncodingSubGraph::generateEquals(EncodingNode *left, EncodingNode *right) {
-       Set *lset=left->s;
-       Set *rset=right->s;
-       uint lSize=lset->getSize(), rSize=rset->getSize();
-       for(uint lindex=0; lindex < lSize; lindex++) {
-               for(uint rindex=0; rindex < rSize; rindex++) {
-                       uint64_t lVal=lset->getElement(lindex);
+       Set *lset = left->s;
+       Set *rset = right->s;
+       uint lSize = lset->getSize(), rSize = rset->getSize();
+       for (uint lindex = 0; lindex < lSize; lindex++) {
+               for (uint rindex = 0; rindex < rSize; rindex++) {
+                       uint64_t lVal = lset->getElement(lindex);
                        NodeValuePair nvp1(left, lVal);
                        EncodingValue *lev = map.get(&nvp1);
-                       uint64_t rVal=rset->getElement(rindex);
+                       uint64_t rVal = rset->getElement(rindex);
                        NodeValuePair nvp2(right, rVal);
                        EncodingValue *rev = map.get(&nvp2);
                        if (lev != rev) {
@@ -252,21 +257,21 @@ void EncodingSubGraph::generateEquals(EncodingNode *left, EncodingNode *right) {
 }
 
 void EncodingSubGraph::generateComparison(EncodingNode *left, EncodingNode *right) {
-       Set *lset=left->s;
-       Set *rset=right->s;
-       uint lindex=0, rindex=0;
-       uint lSize=lset->getSize(), rSize=rset->getSize();
-       uint64_t lVal=lset->getElement(lindex);
+       Set *lset = left->s;
+       Set *rset = right->s;
+       uint lindex = 0, rindex = 0;
+       uint lSize = lset->getSize(), rSize = rset->getSize();
+       uint64_t lVal = lset->getElement(lindex);
        NodeValuePair nvp1(left, lVal);
        EncodingValue *lev = map.get(&nvp1);
        lev->inComparison = true;
-       uint64_t rVal=rset->getElement(rindex);
+       uint64_t rVal = rset->getElement(rindex);
        NodeValuePair nvp2(right, rVal);
        EncodingValue *rev = map.get(&nvp2);
        rev->inComparison = true;
        EncodingValue *last = NULL;
 
-       while(lindex < lSize || rindex < rSize) {
+       while (lindex < lSize || rindex < rSize) {
                if (last != NULL) {
                        if (lev != NULL)
                                orderEV(last, lev);
@@ -280,7 +285,7 @@ void EncodingSubGraph::generateComparison(EncodingNode *left, EncodingNode *righ
                                        orderEV(lev, rev);
                                last = lev;
                                if (++lindex < lSize) {
-                                       lVal=lset->getElement(lindex);
+                                       lVal = lset->getElement(lindex);
                                        NodeValuePair nvpl(left, lVal);
                                        lev = map.get(&nvpl);
                                        lev->inComparison = true;
@@ -291,7 +296,7 @@ void EncodingSubGraph::generateComparison(EncodingNode *left, EncodingNode *righ
                                        orderEV(rev, lev);
                                last = rev;
                                if (++rindex < rSize) {
-                                       rVal=rset->getElement(rindex);
+                                       rVal = rset->getElement(rindex);
                                        NodeValuePair nvpr(right, rVal);
                                        rev = map.get(&nvpr);
                                        rev->inComparison = true;
@@ -301,7 +306,7 @@ void EncodingSubGraph::generateComparison(EncodingNode *left, EncodingNode *righ
                } else {
                        last = lev;
                        if (++lindex < lSize) {
-                               lVal=lset->getElement(lindex);
+                               lVal = lset->getElement(lindex);
                                NodeValuePair nvpl(left, lVal);
                                lev = map.get(&nvpl);
                                lev->inComparison = true;
@@ -309,7 +314,7 @@ void EncodingSubGraph::generateComparison(EncodingNode *left, EncodingNode *righ
                                lev = NULL;
 
                        if (++rindex < rSize) {
-                               rVal=rset->getElement(rindex);
+                               rVal = rset->getElement(rindex);
                                NodeValuePair nvpr(right, rVal);
                                rev = map.get(&nvpr);
                                rev->inComparison = true;
@@ -320,12 +325,12 @@ void EncodingSubGraph::generateComparison(EncodingNode *left, EncodingNode *righ
 }
 
 void EncodingSubGraph::computeEncodingValue() {
-       SetIteratorEncodingNode *nodeit=nodes.iterator();
-       while(nodeit->hasNext()) {
-               EncodingNode *node=nodeit->next();
-               Set * set = node->s;
+       SetIteratorEncodingNode *nodeit = nodes.iterator();
+       while (nodeit->hasNext()) {
+               EncodingNode *node = nodeit->next();
+               Set *set = node->s;
                uint setSize = set->getSize();
-               for(uint i=0; i<setSize; i++) {
+               for (uint i = 0; i < setSize; i++) {
                        uint64_t val = set->getElement(i);
                        NodeValuePair nvp(node, val);
                        if (!map.contains(&nvp)) {
@@ -337,21 +342,21 @@ void EncodingSubGraph::computeEncodingValue() {
 }
 
 void EncodingSubGraph::traverseValue(EncodingNode *node, uint64_t value) {
-       EncodingValue *ecv=new EncodingValue(value);
+       EncodingValue *ecv = new EncodingValue(value);
        values.add(ecv);
        HashsetEncodingNode discovered;
        Vector<EncodingNode *> tovisit;
        tovisit.push(node);
        discovered.add(node);
-       while(tovisit.getSize()!=0) {
-               EncodingNode *n=tovisit.last();tovisit.pop();
+       while (tovisit.getSize() != 0) {
+               EncodingNode *n = tovisit.last();tovisit.pop();
                //Add encoding node to structures
                ecv->nodes.add(n);
-               NodeValuePair *nvp=new NodeValuePair(n, value);
+               NodeValuePair *nvp = new NodeValuePair(n, value);
                map.put(nvp, ecv);
-               SetIteratorEncodingEdge *edgeit=node->edges.iterator();
-               while(edgeit->hasNext()) {
-                       EncodingEdge *ee=edgeit->next();
+               SetIteratorEncodingEdge *edgeit = node->edges.iterator();
+               while (edgeit->hasNext()) {
+                       EncodingEdge *ee = edgeit->next();
                        if (!discovered.contains(ee->left) && nodes.contains(ee->left) && ee->left->s->exists(value)) {
                                tovisit.push(ee->left);
                                discovered.add(ee->left);
index 1f90e917fd053b34755bc2e6f40a265362785f37..88a129129a8c3de1e8b005469727ba1656218e61 100644 (file)
@@ -5,8 +5,8 @@
 #include "graphstructs.h"
 
 class NodeValuePair {
- public:
- NodeValuePair(EncodingNode *n, uint64_t val) : node(n), value(val) {}
+public:
      NodeValuePair(EncodingNode *n, uint64_t val) : node(n), value(val) {}
        EncodingNode *node;
        uint64_t value;
 };
@@ -17,8 +17,8 @@ typedef Hashset<EncodingValue *, uintptr_t, PTRSHIFT> HashsetEncodingValue;
 typedef SetIterator<EncodingValue *, uintptr_t, PTRSHIFT> SetIteratorEncodingValue;
 
 class EncodingValue {
- public:
- EncodingValue(uint64_t _val) : value(_val), encoding(0), inComparison(false), assigned(false) {}
+public:
      EncodingValue(uint64_t _val) : value(_val), encoding(0), inComparison(false), assigned(false) {}
        void merge(EncodingValue *value);
        uint64_t value;
        uint encoding;
@@ -35,16 +35,17 @@ bool equalsNodeValuePair(NodeValuePair *nvp1, NodeValuePair *nvp2);
 typedef Hashtable<NodeValuePair *, EncodingValue *, uintptr_t, 0, hashNodeValuePair, equalsNodeValuePair> NVPMap;
 
 class EncodingSubGraph {
- public:
+public:
        EncodingSubGraph();
+       ~EncodingSubGraph();
        void addNode(EncodingNode *n);
-       SetIteratorEncodingNode * nodeIterator();
+       SetIteratorEncodingNode *nodeIterator();
        void encode();
        uint getEncoding(EncodingNode *n, uint64_t val);
-       uint getEncodingSize(EncodingNode *n) { return maxEncodingVal;}
-       
+       uint getEncodingMaxVal(EncodingNode *n) { return maxEncodingVal;}
+
        CMEMALLOC;
- private:
+private:
        uint estimateNewSize(EncodingNode *n);
        uint estimateNewSize(EncodingSubGraph *sg);
        void traverseValue(EncodingNode *node, uint64_t value);
@@ -63,7 +64,7 @@ class EncodingSubGraph {
        uint encodingSize;
        uint numElements;
        uint maxEncodingVal;
-       
+
        friend class EncodingGraph;
 };
 
index 8bffb4e8f0e7818bed8ea73592ba562381fa19f7..c8c7e36d67a4e7bde00aab324b51b539770ac01b 100644 (file)
 #include "mutableset.h"
 #include "tunable.h"
 
-void DFS(OrderGraph *graph, Vector<OrderNode *> *finishNodes) {
-       SetIteratorOrderNode *iterator = graph->getNodes();
-       while (iterator->hasNext()) {
-               OrderNode *node = iterator->next();
-               if (node->status == NOTVISITED) {
-                       node->status = VISITED;
-                       DFSNodeVisit(node, finishNodes, false, false, 0);
-                       node->status = FINISHED;
-                       finishNodes->push(node);
-               }
-       }
-       delete iterator;
-}
-
-void DFSReverse(OrderGraph *graph, Vector<OrderNode *> *finishNodes) {
-       uint size = finishNodes->getSize();
-       uint sccNum = 1;
-       for (int i = size - 1; i >= 0; i--) {
-               OrderNode *node = finishNodes->get(i);
-               if (node->status == NOTVISITED) {
-                       node->status = VISITED;
-                       DFSNodeVisit(node, NULL, true, false, sccNum);
-                       node->sccNum = sccNum;
-                       node->status = FINISHED;
-                       sccNum++;
-               }
-       }
-}
-
-void DFSNodeVisit(OrderNode *node, Vector<OrderNode *> *finishNodes, bool isReverse, bool mustvisit, uint sccNum) {
-       SetIteratorOrderEdge *iterator = isReverse ? node->inEdges.iterator() : node->outEdges.iterator();
-#ifdef TRACE_DEBUG
-        model_print("Node:%lu=>", node->id);
-#endif
-       while (iterator->hasNext()) {
-               OrderEdge *edge = iterator->next();
-#ifdef TRACE_DEBUG
-                model_print("Edge:%lu=>",(uintptr_t) edge);
-#endif
-                if (mustvisit) {
-                       if (!edge->mustPos)
-                               continue;
-               } else
-               if (!edge->polPos && !edge->pseudoPos)  //Ignore edges that do not have positive polarity
-                       continue;
-
-               OrderNode *child = isReverse ? edge->source : edge->sink;
-#ifdef TRACE_DEBUG
-                model_println("NodeChild:%lu", child->id);
-#endif
-                if (child->status == NOTVISITED) {
-                       child->status = VISITED;
-                       DFSNodeVisit(child, finishNodes, isReverse, mustvisit, sccNum);
-                       child->status = FINISHED;
-                       if (finishNodes != NULL)
-                               finishNodes->push(child);
-                       if (isReverse)
-                               child->sccNum = sccNum;
-               }
-       }
-       delete iterator;
-}
-
-void resetNodeInfoStatusSCC(OrderGraph *graph) {
-       SetIteratorOrderNode *iterator = graph->getNodes();
-       while (iterator->hasNext()) {
-               iterator->next()->status = NOTVISITED;
-       }
-       delete iterator;
-}
-
-void computeStronglyConnectedComponentGraph(OrderGraph *graph) {
-       Vector<OrderNode *> finishNodes;
-       DFS(graph, &finishNodes);
-       resetNodeInfoStatusSCC(graph);
-       DFSReverse(graph, &finishNodes);
-       resetNodeInfoStatusSCC(graph);
-}
-
-bool isMustBeTrueNode(OrderNode *node) {
-       SetIteratorOrderEdge *iterator = node->inEdges.iterator();
-       while (iterator->hasNext()) {
-               OrderEdge *edge = iterator->next();
-               if (!edge->mustPos) {
-                       delete iterator;
-                       return false;
-               }
-       }
-       delete iterator;
-       iterator = node->outEdges.iterator();
-       while (iterator->hasNext()) {
-               OrderEdge *edge = iterator->next();
-               if (!edge->mustPos) {
-                       delete iterator;
-                       return false;
-               }
-       }
-       delete iterator;
-       return true;
-}
-
-void bypassMustBeTrueNode(CSolver *This, OrderGraph *graph, OrderNode *node) {
-       SetIteratorOrderEdge *iterin = node->inEdges.iterator();
-       while (iterin->hasNext()) {
-               OrderEdge *inEdge = iterin->next();
-               OrderNode *srcNode = inEdge->source;
-               srcNode->outEdges.remove(inEdge);
-               SetIteratorOrderEdge *iterout = node->outEdges.iterator();
-               while (iterout->hasNext()) {
-                       OrderEdge *outEdge = iterout->next();
-                       OrderNode *sinkNode = outEdge->sink;
-                       sinkNode->inEdges.remove(outEdge);
-                       //Adding new edge to new sink and src nodes ...
-                       if(srcNode == sinkNode){
-#ifdef TRACE_DEBUG
-                                model_println("bypassMustBe 1");
-#endif
-                               This->setUnSAT();
-                               delete iterout;
-                               delete iterin;
-                               return;
-                       }
-                       OrderEdge *newEdge = graph->getOrderEdgeFromOrderGraph(srcNode, sinkNode);
-                       newEdge->mustPos = true;
-                       newEdge->polPos = true;
-                       if (newEdge->mustNeg){
-#ifdef TRACE_DEBUG
-                                model_println("BypassMustBe 2");
-#endif
-                               This->setUnSAT();
-                       }
-                       srcNode->outEdges.add(newEdge);
-                       sinkNode->inEdges.add(newEdge);
-               }
-               delete iterout;
-       }
-       delete iterin;
-}
-
-void removeMustBeTrueNodes(CSolver *This, OrderGraph *graph) {
-       SetIteratorOrderNode *iterator = graph->getNodes();
-       while (iterator->hasNext()) {
-               OrderNode *node = iterator->next();
-               if (isMustBeTrueNode(node)) {
-                       bypassMustBeTrueNode(This, graph, node);
-               }
-       }
-       delete iterator;
-}
-
-/** This function computes a source set for every nodes, the set of
-    nodes that can reach that node via pospolarity edges.  It then
-    looks for negative polarity edges from nodes in the the source set
-    to determine whether we need to generate pseudoPos edges. */
-
-void completePartialOrderGraph(OrderGraph *graph) {
-       Vector<OrderNode *> finishNodes;
-       DFS(graph, &finishNodes);
-       resetNodeInfoStatusSCC(graph);
-       HashtableNodeToNodeSet *table = new HashtableNodeToNodeSet(128, 0.25);
-
-       Vector<OrderNode *> sccNodes;
-
-       uint size = finishNodes.getSize();
-       uint sccNum = 1;
-       for (int i = size - 1; i >= 0; i--) {
-               OrderNode *node = finishNodes.get(i);
-               HashsetOrderNode *sources = new HashsetOrderNode(4, 0.25);
-               table->put(node, sources);
-
-               if (node->status == NOTVISITED) {
-                       //Need to do reverse traversal here...
-                       node->status = VISITED;
-                       DFSNodeVisit(node, &sccNodes, true, false, sccNum);
-                       node->status = FINISHED;
-                       node->sccNum = sccNum;
-                       sccNum++;
-                       sccNodes.push(node);
-
-                       //Compute in set for entire SCC
-                       uint rSize = sccNodes.getSize();
-                       for (uint j = 0; j < rSize; j++) {
-                               OrderNode *rnode = sccNodes.get(j);
-                               //Compute source sets
-                               SetIteratorOrderEdge *iterator = rnode->inEdges.iterator();
-                               while (iterator->hasNext()) {
-                                       OrderEdge *edge = iterator->next();
-                                       OrderNode *parent = edge->source;
-                                       if (edge->polPos) {
-                                               sources->add(parent);
-                                               HashsetOrderNode *parent_srcs = (HashsetOrderNode *)table->get(parent);
-                                               sources->addAll(parent_srcs);
-                                       }
-                               }
-                               delete iterator;
-                       }
-                       for (uint j = 0; j < rSize; j++) {
-                               //Copy in set of entire SCC
-                               OrderNode *rnode = sccNodes.get(j);
-                               HashsetOrderNode *set = (j == 0) ? sources : sources->copy();
-                               table->put(rnode, set);
-
-                               //Use source sets to compute pseudoPos edges
-                               SetIteratorOrderEdge *iterator = node->inEdges.iterator();
-                               while (iterator->hasNext()) {
-                                       OrderEdge *edge = iterator->next();
-                                       OrderNode *parent = edge->source;
-                                       ASSERT(parent != rnode);
-                                       if (edge->polNeg && parent->sccNum != rnode->sccNum &&
-                                                       sources->contains(parent)) {
-                                               OrderEdge *newedge = graph->getOrderEdgeFromOrderGraph(rnode, parent);
-                                               newedge->pseudoPos = true;
-                                       }
-                               }
-                               delete iterator;
-                       }
-
-                       sccNodes.clear();
-               }
-       }
-
-       table->resetanddelete();
-       delete table;
-       resetNodeInfoStatusSCC(graph);
-}
-
-void DFSMust(OrderGraph *graph, Vector<OrderNode *> *finishNodes) {
-       SetIteratorOrderNode *iterator = graph->getNodes();
-       while (iterator->hasNext()) {
-               OrderNode *node = iterator->next();
-               if (node->status == NOTVISITED) {
-                       node->status = VISITED;
-                       DFSNodeVisit(node, finishNodes, false, true, 0);
-                       node->status = FINISHED;
-                       finishNodes->push(node);
-               }
-       }
-       delete iterator;
-}
-
 void DFSClearContradictions(CSolver *solver, OrderGraph *graph, Vector<OrderNode *> *finishNodes, bool computeTransitiveClosure) {
        uint size = finishNodes->getSize();
        HashtableNodeToNodeSet *table = new HashtableNodeToNodeSet(128, 0.25);
@@ -279,15 +39,13 @@ void DFSClearContradictions(CSolver *solver, OrderGraph *graph, Vector<OrderNode
                        SetIteratorOrderNode *srciterator = sources->iterator();
                        while (srciterator->hasNext()) {
                                OrderNode *srcnode = srciterator->next();
+                               if (srcnode->removed)
+                                       continue;
                                OrderEdge *newedge = graph->getOrderEdgeFromOrderGraph(srcnode, node);
                                newedge->mustPos = true;
                                newedge->polPos = true;
-                               if (newedge->mustNeg){
-#ifdef TRACE_DEBUG
-                                        model_println("DFS clear 1");
-#endif
+                               if (newedge->mustNeg)
                                        solver->setUnSAT();
-                                }
                                srcnode->outEdges.add(newedge);
                                node->inEdges.add(newedge);
                        }
@@ -302,12 +60,8 @@ void DFSClearContradictions(CSolver *solver, OrderGraph *graph, Vector<OrderNode
                                if (!edge->mustPos && sources->contains(parent)) {
                                        edge->mustPos = true;
                                        edge->polPos = true;
-                                       if (edge->mustNeg){
-#ifdef TRACE_DEBUG
-                                                model_println("DFS clear 2");
-#endif
-                                                solver->setUnSAT();
-                                        }
+                                       if (edge->mustNeg)
+                                               solver->setUnSAT();
                                }
                        }
                        delete iterator;
@@ -321,19 +75,16 @@ void DFSClearContradictions(CSolver *solver, OrderGraph *graph, Vector<OrderNode
                                if (!edge->mustNeg && sources->contains(child)) {
                                        edge->mustNeg = true;
                                        edge->polNeg = true;
-                                       if (edge->mustPos){
-#ifdef TRACE_DEBUG
-                                                model_println("DFS clear 3: NodeFrom:%lu=>edge%lu=>NodeTo:%lu", node->id, (uintptr_t) edge, child->id);
-#endif
-                                                solver->setUnSAT();
-                                        }
+                                       if (edge->mustPos) {
+                                               solver->setUnSAT();
+                                       }
                                }
                        }
                        delete iterator;
                }
        }
 
-       table->resetanddelete();
+       table->resetAndDeleteVals();
        delete table;
 }
 
@@ -345,8 +96,8 @@ void DFSClearContradictions(CSolver *solver, OrderGraph *graph, Vector<OrderNode
 void reachMustAnalysis(CSolver *solver, OrderGraph *graph, bool computeTransitiveClosure) {
        Vector<OrderNode *> finishNodes;
        //Topologically sort the mustPos edge graph
-       DFSMust(graph, &finishNodes);
-       resetNodeInfoStatusSCC(graph);
+       graph->DFSMust(&finishNodes);
+       graph->resetNodeInfoStatusSCC();
 
        //Find any backwards edges that complete cycles and force them to be mustNeg
        DFSClearContradictions(solver, graph, &finishNodes, computeTransitiveClosure);
@@ -365,12 +116,8 @@ void localMustAnalysisTotal(CSolver *solver, OrderGraph *graph) {
                        if (invEdge != NULL) {
                                if (!invEdge->mustPos) {
                                        invEdge->polPos = false;
-                               } else {
-#ifdef TRACE_DEBUG
-                                        model_println("localMustAnalysis Total");
-#endif
+                               } else
                                        solver->setUnSAT();
-                               }
                                invEdge->mustNeg = true;
                                invEdge->polNeg = true;
                        }
@@ -391,22 +138,15 @@ void localMustAnalysisPartial(CSolver *solver, OrderGraph *graph) {
                if (edge->mustPos) {
                        if (!edge->mustNeg) {
                                edge->polNeg = false;
-                       } else{
-#ifdef TRACE_DEBUG
-                                model_println("Local must analysis partial");
-#endif
+                       } else {
                                solver->setUnSAT();
-                        }
+                       }
                        OrderEdge *invEdge = graph->getInverseOrderEdge(edge);
                        if (invEdge != NULL) {
                                if (!invEdge->mustPos)
                                        invEdge->polPos = false;
-                               else{
-#ifdef TRACE_DEBUG
-                                        model_println("Local must analysis partial 2");
-#endif
+                               else
                                        solver->setUnSAT();
-                                }
                                invEdge->mustNeg = true;
                                invEdge->polNeg = true;
                        }
index b04ccfddc465ef6abef06c7a0e3c8e79e0a46092..24ec85c3e357766b411c4dac80f5834afb9f2103 100644 (file)
@@ -4,17 +4,6 @@
 #include "structs.h"
 #include "mymemory.h"
 
-void computeStronglyConnectedComponentGraph(OrderGraph *graph);
-void initializeNodeInfoSCC(OrderGraph *graph);
-void DFSNodeVisit(OrderNode *node, Vector<OrderNode *> *finishNodes, bool isReverse, bool mustvisit, uint sccNum);
-void DFS(OrderGraph *graph, Vector<OrderNode *> *finishNodes);
-void DFSReverse(OrderGraph *graph, Vector<OrderNode *> *finishNodes);
-void completePartialOrderGraph(OrderGraph *graph);
-void resetNodeInfoStatusSCC(OrderGraph *graph);
-bool isMustBeTrueNode(OrderNode *node);
-void bypassMustBeTrueNode(CSolver *This, OrderGraph *graph, OrderNode *node);
-void removeMustBeTrueNodes(CSolver *This, OrderGraph *graph);
-void DFSMust(OrderGraph *graph, Vector<OrderNode *> *finishNodes);
 void DFSClearContradictions(CSolver *solver, OrderGraph *graph, Vector<OrderNode *> *finishNodes, bool computeTransitiveClosure);
 void reachMustAnalysis(CSolver *solver, OrderGraph *graph, bool computeTransitiveClosure);
 void localMustAnalysisTotal(CSolver *solver, OrderGraph *graph);
index 822af1f517a58ecb9c7d83239f7fa2dd877e4e94..85a020789be949c0fca91c23d835a7f0cb55bcdb 100644 (file)
@@ -6,15 +6,12 @@
 #include "order.h"
 
 OrderGraph::OrderGraph(Order *_order) :
-       nodes(new HashsetOrderNode()),
-       edges(new HashsetOrderEdge()),
        order(_order) {
 }
 
 OrderGraph *buildOrderGraph(Order *order) {
-        ASSERT(order->graph == NULL);
+       ASSERT(order->graph == NULL);
        OrderGraph *orderGraph = new OrderGraph(order);
-       order->graph = orderGraph;
        uint constrSize = order->constraints.getSize();
        for (uint j = 0; j < constrSize; j++) {
                orderGraph->addOrderConstraintToOrderGraph(order->constraints.get(j));
@@ -24,7 +21,7 @@ OrderGraph *buildOrderGraph(Order *order) {
 
 //Builds only the subgraph for the must order graph.
 OrderGraph *buildMustOrderGraph(Order *order) {
-        ASSERT(order->graph == NULL);
+       ASSERT(order->graph == NULL);
        OrderGraph *orderGraph = new OrderGraph(order);
        uint constrSize = order->constraints.getSize();
        for (uint j = 0; j < constrSize; j++) {
@@ -73,6 +70,16 @@ void OrderGraph::addOrderEdge(OrderNode *node1, OrderNode *node2, BooleanOrder *
        }
 }
 
+void OrderGraph::addEdge(uint64_t first, uint64_t second) {
+       OrderNode *node1 = getOrderNodeFromOrderGraph(first);
+       OrderNode *node2 = getOrderNodeFromOrderGraph(second);
+       OrderEdge *_1to2 = getOrderEdgeFromOrderGraph(node1, node2);
+       _1to2->polPos = true;
+       _1to2->mustPos = true;
+       node1->addNewOutgoingEdge(_1to2);
+       node2->addNewIncomingEdge(_1to2);
+}
+
 void OrderGraph::addMustOrderEdge(OrderNode *node1, OrderNode *node2, BooleanOrder *constr) {
        BooleanValue mustval = constr->boolVal;
        switch (mustval) {
@@ -110,43 +117,43 @@ void OrderGraph::addMustOrderEdge(OrderNode *node1, OrderNode *node2, BooleanOrd
 
 OrderNode *OrderGraph::getOrderNodeFromOrderGraph(uint64_t id) {
        OrderNode *node = new OrderNode(id);
-       OrderNode *tmp = nodes->get(node);
+       OrderNode *tmp = nodes.get(node);
        if ( tmp != NULL) {
                delete node;
                node = tmp;
        } else {
-               nodes->add(node);
+               nodes.add(node);
        }
        return node;
 }
 
 OrderNode *OrderGraph::lookupOrderNodeFromOrderGraph(uint64_t id) {
        OrderNode node(id);
-       OrderNode *tmp = nodes->get(&node);
+       OrderNode *tmp = nodes.get(&node);
        return tmp;
 }
 
 OrderEdge *OrderGraph::getOrderEdgeFromOrderGraph(OrderNode *begin, OrderNode *end) {
        OrderEdge *edge = new OrderEdge(begin, end);
-       OrderEdge *tmp = edges->get(edge);
+       OrderEdge *tmp = edges.get(edge);
        if ( tmp != NULL ) {
                delete edge;
                edge = tmp;
        } else {
-               edges->add(edge);
+               edges.add(edge);
        }
        return edge;
 }
 
 OrderEdge *OrderGraph::lookupOrderEdgeFromOrderGraph(OrderNode *begin, OrderNode *end) {
        OrderEdge edge(begin, end);
-       OrderEdge *tmp = edges->get(&edge);
+       OrderEdge *tmp = edges.get(&edge);
        return tmp;
 }
 
 OrderEdge *OrderGraph::getInverseOrderEdge(OrderEdge *edge) {
        OrderEdge inverseedge(edge->sink, edge->source);
-       OrderEdge *tmp = edges->get(&inverseedge);
+       OrderEdge *tmp = edges.get(&inverseedge);
        return tmp;
 }
 
@@ -163,40 +170,27 @@ void OrderGraph::addMustOrderConstraintToOrderGraph(BooleanOrder *bOrder) {
 }
 
 OrderGraph::~OrderGraph() {
-       SetIteratorOrderNode *iterator = nodes->iterator();
-       while (iterator->hasNext()) {
-               OrderNode *node = iterator->next();
-               delete node;
-       }
-       delete iterator;
-
-       SetIteratorOrderEdge *eiterator = edges->iterator();
-       while (eiterator->hasNext()) {
-               OrderEdge *edge = eiterator->next();
-               delete edge;
-       }
-       delete eiterator;
-       delete nodes;
-       delete edges;
+       nodes.resetAndDelete();
+       edges.resetAndDelete();
 }
 
-bool OrderGraph::isTherePath(OrderNode *source, OrderNode *destination){
+bool OrderGraph::isTherePath(OrderNode *source, OrderNode *destination) {
        HashsetOrderNode visited;
        visited.add(source);
        SetIteratorOrderEdge *iterator = source->outEdges.iterator();
        bool found = false;
-       while(iterator->hasNext()){
-               OrderEdgeedge = iterator->next();
-               if(edge->polPos){
-                       OrderNodenode = edge->sink;
-                       if(!visited.contains(node)){
-                               if( node == destination ){
+       while (iterator->hasNext()) {
+               OrderEdge *edge = iterator->next();
+               if (edge->polPos) {
+                       OrderNode *node = edge->sink;
+                       if (!visited.contains(node)) {
+                               if ( node == destination ) {
                                        found = true;
                                        break;
                                }
                                visited.add(node);
-                               found =isTherePathVisit(visited, node, destination);
-                               if(found){
+                               found = isTherePathVisit(visited, node, destination);
+                               if (found) {
                                        break;
                                }
                        }
@@ -206,19 +200,19 @@ bool OrderGraph::isTherePath(OrderNode *source, OrderNode *destination){
        return found;
 }
 
-bool OrderGraph::isTherePathVisit(HashsetOrderNode &visited, OrderNode* current, OrderNode* destination){
+bool OrderGraph::isTherePathVisit(HashsetOrderNode &visited, OrderNode *current, OrderNode *destination) {
        SetIteratorOrderEdge *iterator = current->outEdges.iterator();
        bool found = false;
-       while(iterator->hasNext()){
-               OrderEdgeedge = iterator->next();
-               if(edge->polPos){
-                       OrderNodenode = edge->sink;
-                       if(node == destination){
+       while (iterator->hasNext()) {
+               OrderEdge *edge = iterator->next();
+               if (edge->polPos) {
+                       OrderNode *node = edge->sink;
+                       if (node == destination) {
                                found = true;
                                break;
                        }
                        visited.add(node);
-                       if(isTherePathVisit(visited, node, destination)){
+                       if (isTherePathVisit(visited, node, destination)) {
                                found = true;
                                break;
                        }
@@ -227,3 +221,164 @@ bool OrderGraph::isTherePathVisit(HashsetOrderNode &visited, OrderNode* current,
        delete iterator;
        return found;
 }
+
+void OrderGraph::DFS(Vector<OrderNode *> *finishNodes) {
+       SetIteratorOrderNode *iterator = getNodes();
+       while (iterator->hasNext()) {
+               OrderNode *node = iterator->next();
+               if (node->status == NOTVISITED && !node->removed) {
+                       node->status = VISITED;
+                       DFSNodeVisit(node, finishNodes, false, false, 0);
+                       node->status = FINISHED;
+                       finishNodes->push(node);
+               }
+       }
+       delete iterator;
+}
+
+void OrderGraph::DFSMust(Vector<OrderNode *> *finishNodes) {
+       SetIteratorOrderNode *iterator = getNodes();
+       while (iterator->hasNext()) {
+               OrderNode *node = iterator->next();
+               if (node->status == NOTVISITED && !node->removed) {
+                       node->status = VISITED;
+                       DFSNodeVisit(node, finishNodes, false, true, 0);
+                       node->status = FINISHED;
+                       finishNodes->push(node);
+               }
+       }
+       delete iterator;
+}
+
+void OrderGraph::DFSReverse(Vector<OrderNode *> *finishNodes) {
+       uint size = finishNodes->getSize();
+       uint sccNum = 1;
+       for (int i = size - 1; i >= 0; i--) {
+               OrderNode *node = finishNodes->get(i);
+               if (node->status == NOTVISITED) {
+                       node->status = VISITED;
+                       DFSNodeVisit(node, NULL, true, false, sccNum);
+                       node->sccNum = sccNum;
+                       node->status = FINISHED;
+                       sccNum++;
+               }
+       }
+}
+
+void OrderGraph::DFSNodeVisit(OrderNode *node, Vector<OrderNode *> *finishNodes, bool isReverse, bool mustvisit, uint sccNum) {
+       SetIteratorOrderEdge *iterator = isReverse ? node->inEdges.iterator() : node->outEdges.iterator();
+       while (iterator->hasNext()) {
+               OrderEdge *edge = iterator->next();
+               if (mustvisit) {
+                       if (!edge->mustPos)
+                               continue;
+               } else
+               if (!edge->polPos && !edge->pseudoPos)          //Ignore edges that do not have positive polarity
+                       continue;
+
+               OrderNode *child = isReverse ? edge->source : edge->sink;
+               if (child->status == NOTVISITED) {
+                       child->status = VISITED;
+                       DFSNodeVisit(child, finishNodes, isReverse, mustvisit, sccNum);
+                       child->status = FINISHED;
+                       if (finishNodes != NULL) {
+                               finishNodes->push(child);
+                       }
+                       if (isReverse)
+                               child->sccNum = sccNum;
+               }
+       }
+       delete iterator;
+}
+
+void OrderGraph::resetNodeInfoStatusSCC() {
+       SetIteratorOrderNode *iterator = getNodes();
+       while (iterator->hasNext()) {
+               iterator->next()->status = NOTVISITED;
+       }
+       delete iterator;
+}
+
+void OrderGraph::computeStronglyConnectedComponentGraph() {
+       Vector<OrderNode *> finishNodes;
+       DFS(&finishNodes);
+       resetNodeInfoStatusSCC();
+       DFSReverse(&finishNodes);
+       resetNodeInfoStatusSCC();
+}
+
+/** This function computes a source set for every nodes, the set of
+    nodes that can reach that node via pospolarity edges.  It then
+    looks for negative polarity edges from nodes in the the source set
+    to determine whether we need to generate pseudoPos edges. */
+
+void OrderGraph::completePartialOrderGraph() {
+       Vector<OrderNode *> finishNodes;
+       DFS(&finishNodes);
+       resetNodeInfoStatusSCC();
+       HashtableNodeToNodeSet *table = new HashtableNodeToNodeSet(128, 0.25);
+
+       Vector<OrderNode *> sccNodes;
+
+       uint size = finishNodes.getSize();
+       uint sccNum = 1;
+       for (int i = size - 1; i >= 0; i--) {
+               OrderNode *node = finishNodes.get(i);
+               HashsetOrderNode *sources = new HashsetOrderNode(4, 0.25);
+               table->put(node, sources);
+
+               if (node->status == NOTVISITED) {
+                       //Need to do reverse traversal here...
+                       node->status = VISITED;
+                       DFSNodeVisit(node, &sccNodes, true, false, sccNum);
+                       node->status = FINISHED;
+                       node->sccNum = sccNum;
+                       sccNum++;
+                       sccNodes.push(node);
+
+                       //Compute in set for entire SCC
+                       uint rSize = sccNodes.getSize();
+                       for (uint j = 0; j < rSize; j++) {
+                               OrderNode *rnode = sccNodes.get(j);
+                               //Compute source sets
+                               SetIteratorOrderEdge *iterator = rnode->inEdges.iterator();
+                               while (iterator->hasNext()) {
+                                       OrderEdge *edge = iterator->next();
+                                       OrderNode *parent = edge->source;
+                                       if (edge->polPos) {
+                                               sources->add(parent);
+                                               HashsetOrderNode *parent_srcs = (HashsetOrderNode *)table->get(parent);
+                                               sources->addAll(parent_srcs);
+                                       }
+                               }
+                               delete iterator;
+                       }
+                       for (uint j = 0; j < rSize; j++) {
+                               //Copy in set of entire SCC
+                               OrderNode *rnode = sccNodes.get(j);
+                               HashsetOrderNode *set = (j == 0) ? sources : sources->copy();
+                               table->put(rnode, set);
+
+                               //Use source sets to compute pseudoPos edges
+                               SetIteratorOrderEdge *iterator = node->inEdges.iterator();
+                               while (iterator->hasNext()) {
+                                       OrderEdge *edge = iterator->next();
+                                       OrderNode *parent = edge->source;
+                                       ASSERT(parent != rnode);
+                                       if (edge->polNeg && parent->sccNum != rnode->sccNum &&
+                                                       sources->contains(parent)) {
+                                               OrderEdge *newedge = getOrderEdgeFromOrderGraph(rnode, parent);
+                                               newedge->pseudoPos = true;
+                                       }
+                               }
+                               delete iterator;
+                       }
+
+                       sccNodes.clear();
+               }
+       }
+
+       table->resetAndDeleteVals();
+       delete table;
+       resetNodeInfoStatusSCC();
+}
index a155c7f0e4e82353301fe3dcd82e33c401b9d0b2..2b2fc59aa9cb0924ea0dbe1378c4a0855730fcef 100644 (file)
@@ -23,18 +23,26 @@ public:
        OrderEdge *lookupOrderEdgeFromOrderGraph(OrderNode *begin, OrderNode *end);
        void addOrderEdge(OrderNode *node1, OrderNode *node2, BooleanOrder *constr);
        void addMustOrderEdge(OrderNode *node1, OrderNode *node2, BooleanOrder *constr);
+       void addEdge(uint64_t first, uint64_t second);
        OrderEdge *getInverseOrderEdge(OrderEdge *edge);
-       Order *getOrder() {return order;} 
-       bool isTherePath(OrderNode* source, OrderNode* destination);
-       bool isTherePathVisit(HashsetOrderNode &visited, OrderNode* current, OrderNode* destination);
-       SetIteratorOrderNode *getNodes() {return nodes->iterator();}
-       SetIteratorOrderEdge *getEdges() {return edges->iterator();}
+       Order *getOrder() {return order;}
+       bool isTherePath(OrderNode *source, OrderNode *destination);
+       bool isTherePathVisit(HashsetOrderNode &visited, OrderNode *current, OrderNode *destination);
+       SetIteratorOrderNode *getNodes() {return nodes.iterator();}
+       SetIteratorOrderEdge *getEdges() {return edges.iterator();}
+       void DFS(Vector<OrderNode *> *finishNodes);
+       void DFSMust(Vector<OrderNode *> *finishNodes);
+       void computeStronglyConnectedComponentGraph();
+       void resetNodeInfoStatusSCC();
+       void completePartialOrderGraph();
 
        CMEMALLOC;
 private:
-       HashsetOrderNode *nodes;
-       HashsetOrderEdge *edges;
+       HashsetOrderNode nodes;
+       HashsetOrderEdge edges;
        Order *order;
+       void DFSNodeVisit(OrderNode *node, Vector<OrderNode *> *finishNodes, bool isReverse, bool mustvisit, uint sccNum);
+       void DFSReverse(Vector<OrderNode *> *finishNodes);
 };
 
 OrderGraph *buildOrderGraph(Order *order);
index 02f314694d31039468b7e31e60f3f10d33cb3c88..41b11a57240ea3b4a2b79188f61218f317defd4c 100644 (file)
@@ -4,6 +4,7 @@
 OrderNode::OrderNode(uint64_t _id) :
        id(_id),
        status(NOTVISITED),
+       removed(false),
        sccNum(0),
        inEdges(),
        outEdges() {
index 50543ac8a7fb19f1d02af05f0f9fb9bc3a07e98b..a9bc1d3f4cb596052ab6fc0191440db373d0e53c 100644 (file)
@@ -22,9 +22,11 @@ public:
        OrderNode(uint64_t id);
        void addNewIncomingEdge(OrderEdge *edge);
        void addNewOutgoingEdge(OrderEdge *edge);
+       uint64_t getID() {return id;}
 
        uint64_t id;
        NodeStatus status;
+       bool removed;
        uint sccNum;
        HashsetOrderEdge inEdges;
        HashsetOrderEdge outEdges;
index 0be806623602a3ae1d59fbce9e073d2a24c91a80..6254832477b7abd72102e544e2d75012a026f671 100644 (file)
@@ -46,10 +46,10 @@ void computePredicatePolarity(BooleanPredicate *This) {
 }
 
 void computeLogicOpPolarity(BooleanLogic *This) {
-       Polarity child=computeLogicOpPolarityChildren(This);
+       Polarity child = computeLogicOpPolarityChildren(This);
        uint size = This->inputs.getSize();
        for (uint i = 0; i < size; i++) {
-               BooleanEdge b=This->inputs.get(i);
+               BooleanEdge b = This->inputs.get(i);
                computePolarity(b.getBoolean(), b.isNegated() ? negatePolarity(child) : child);
        }
 }
index 3791b100fe6358f0ee39b3e2cce90a4410408526..1e0426c32a00d33eb284f059269b3fbad594c50a 100644 (file)
@@ -28,29 +28,30 @@ DecomposeOrderTransform::~DecomposeOrderTransform() {
 
 void DecomposeOrderTransform::doTransform() {
        HashsetOrder *orders = solver->getActiveOrders()->copy();
-       SetIteratorOrder * orderit=orders->iterator();
-       while(orderit->hasNext()) {
+       SetIteratorOrder *orderit = orders->iterator();
+       while (orderit->hasNext()) {
                Order *order = orderit->next();
 
                if (GETVARTUNABLE(solver->getTuner(), order->type, DECOMPOSEORDER, &onoff) == 0) {
                        continue;
                }
 
+               DecomposeOrderResolver *dor = new DecomposeOrderResolver(order);
+               order->setOrderResolver(dor);
+
                OrderGraph *graph = buildOrderGraph(order);
                if (order->type == SATC_PARTIAL) {
                        //Required to do SCC analysis for partial order graphs.  It
                        //makes sure we don't incorrectly optimize graphs with negative
                        //polarity edges
-                       completePartialOrderGraph(graph);
+                       graph->completePartialOrderGraph();
                }
 
                bool mustReachGlobal = GETVARTUNABLE(solver->getTuner(), order->type, MUSTREACHGLOBAL, &onoff);
-
                if (mustReachGlobal)
                        reachMustAnalysis(solver, graph, false);
 
                bool mustReachLocal = GETVARTUNABLE(solver->getTuner(), order->type, MUSTREACHLOCAL, &onoff);
-
                if (mustReachLocal) {
                        //This pair of analysis is also optional
                        if (order->type == SATC_PARTIAL) {
@@ -60,35 +61,55 @@ void DecomposeOrderTransform::doTransform() {
                        }
                }
 
-               
                bool mustReachPrune = GETVARTUNABLE(solver->getTuner(), order->type, MUSTREACHPRUNE, &onoff);
+               HashsetOrderEdge *edgesRemoved = NULL;
+
+               if (mustReachPrune) {
+                       edgesRemoved = new HashsetOrderEdge();
+                       removeMustBeTrueNodes(graph, edgesRemoved);
+               }
 
-               if (mustReachPrune)
-                       removeMustBeTrueNodes(solver, graph);
-               
                //This is needed for splitorder
-               computeStronglyConnectedComponentGraph(graph);
-               decomposeOrder(order, graph);
+               graph->computeStronglyConnectedComponentGraph();
+               decomposeOrder(order, graph, edgesRemoved, dor);
+               if (edgesRemoved != NULL)
+                       delete edgesRemoved;
+               delete graph;
        }
        delete orderit;
        delete orders;
 }
 
 
-void DecomposeOrderTransform::decomposeOrder (Order *currOrder, OrderGraph *currGraph) {
-       Vector<Order *> ordervec;
+void DecomposeOrderTransform::decomposeOrder(Order *currOrder, OrderGraph *currGraph, HashsetOrderEdge *edgesRemoved, DecomposeOrderResolver *dor) {
        Vector<Order *> partialcandidatevec;
        uint size = currOrder->constraints.getSize();
        for (uint i = 0; i < size; i++) {
                BooleanOrder *orderconstraint = currOrder->constraints.get(i);
                OrderNode *from = currGraph->getOrderNodeFromOrderGraph(orderconstraint->first);
                OrderNode *to = currGraph->getOrderNodeFromOrderGraph(orderconstraint->second);
+               OrderEdge *edge = currGraph->lookupOrderEdgeFromOrderGraph(from, to);
+               OrderEdge *invedge = currGraph->lookupOrderEdgeFromOrderGraph(to, from);
+               if (edgesRemoved != NULL) {
+                       if (edgesRemoved->contains(edge)) {
+                               dor->mustOrderEdge(from->getID(), to->getID());
+                               solver->replaceBooleanWithTrue(orderconstraint);
+                               continue;
+                       } else if (edgesRemoved->contains(invedge)) {
+                               dor->mustOrderEdge(to->getID(), from->getID());
+                               solver->replaceBooleanWithFalse(orderconstraint);
+                               continue;
+                       }
+               }
+
                if (from->sccNum != to->sccNum) {
-                       OrderEdge *edge = currGraph->lookupOrderEdgeFromOrderGraph(from, to);
                        if (edge != NULL) {
                                if (edge->polPos) {
+                                       dor->mustOrderEdge(from->getID(), to->getID());
                                        solver->replaceBooleanWithTrue(orderconstraint);
                                } else if (edge->polNeg) {
+                                       if (currOrder->type == SATC_TOTAL)
+                                               dor->mustOrderEdge(to->getID(), from->getID());
                                        solver->replaceBooleanWithFalse(orderconstraint);
                                } else {
                                        //This case should only be possible if constraint isn't in AST
@@ -96,9 +117,9 @@ void DecomposeOrderTransform::decomposeOrder (Order *currOrder, OrderGraph *curr
                                        ;
                                }
                        } else {
-                               OrderEdge *invedge = currGraph->lookupOrderEdgeFromOrderGraph(to, from);
                                if (invedge != NULL) {
                                        if (invedge->polPos) {
+                                               dor->mustOrderEdge(to->getID(), from->getID());
                                                solver->replaceBooleanWithFalse(orderconstraint);
                                        } else if (edge->polNeg) {
                                                //This case shouldn't happen...  If we have a partial order,
@@ -115,12 +136,11 @@ void DecomposeOrderTransform::decomposeOrder (Order *currOrder, OrderGraph *curr
                } else {
                        //Build new order and change constraint's order
                        Order *neworder = NULL;
-                       if (ordervec.getSize() > from->sccNum)
-                               neworder = ordervec.get(from->sccNum);
+                       neworder = dor->getOrder(from->sccNum);
                        if (neworder == NULL) {
                                MutableSet *set = solver->createMutableSet(currOrder->set->getType());
                                neworder = solver->createOrder(currOrder->type, set);
-                               ordervec.setExpand(from->sccNum, neworder);
+                               dor->setOrder(from->sccNum, neworder);
                                if (currOrder->type == SATC_PARTIAL)
                                        partialcandidatevec.setExpand(from->sccNum, neworder);
                                else
@@ -135,15 +155,14 @@ void DecomposeOrderTransform::decomposeOrder (Order *currOrder, OrderGraph *curr
                                ((MutableSet *)neworder->set)->addElementMSet(to->id);
                        }
                        if (currOrder->type == SATC_PARTIAL) {
-                               OrderEdge *edge = currGraph->getOrderEdgeFromOrderGraph(from, to);
                                if (edge->polNeg)
                                        partialcandidatevec.setExpand(from->sccNum, NULL);
                        }
                        orderconstraint->order = neworder;
+                       dor->setEdgeOrder(from->getID(), to->getID(), from->sccNum);
                        neworder->addOrderConstraint(orderconstraint);
                }
        }
-       currOrder->setOrderResolver( new DecomposeOrderResolver(currGraph, ordervec) );
        solver->getActiveOrders()->remove(currOrder);
        uint pcvsize = partialcandidatevec.getSize();
        for (uint i = 0; i < pcvsize; i++) {
@@ -153,3 +172,79 @@ void DecomposeOrderTransform::decomposeOrder (Order *currOrder, OrderGraph *curr
                }
        }
 }
+
+bool DecomposeOrderTransform::isMustBeTrueNode(OrderNode *node) {
+       SetIteratorOrderEdge *iterator = node->inEdges.iterator();
+       while (iterator->hasNext()) {
+               OrderEdge *edge = iterator->next();
+               if (!edge->mustPos) {
+                       delete iterator;
+                       return false;
+               }
+       }
+       delete iterator;
+       iterator = node->outEdges.iterator();
+       while (iterator->hasNext()) {
+               OrderEdge *edge = iterator->next();
+               if (!edge->mustPos) {
+                       delete iterator;
+                       return false;
+               }
+       }
+       delete iterator;
+       return true;
+}
+
+void DecomposeOrderTransform::bypassMustBeTrueNode(OrderGraph *graph, OrderNode *node, HashsetOrderEdge *edgesRemoved) {
+       node->removed = true;
+       SetIteratorOrderEdge *iterin = node->inEdges.iterator();
+       while (iterin->hasNext()) {
+               OrderEdge *inEdge = iterin->next();
+               OrderNode *srcNode = inEdge->source;
+               srcNode->outEdges.remove(inEdge);
+               edgesRemoved->add(inEdge);
+               bool removeOutgoingEdges = !iterin->hasNext();
+
+               SetIteratorOrderEdge *iterout = node->outEdges.iterator();
+               while (iterout->hasNext()) {
+                       OrderEdge *outEdge = iterout->next();
+                       OrderNode *sinkNode = outEdge->sink;
+                       if (removeOutgoingEdges) {
+                               sinkNode->inEdges.remove(outEdge);
+                               edgesRemoved->add(outEdge);
+                       }
+                       //Adding new edge to new sink and src nodes ...
+                       if (srcNode == sinkNode) {
+                               solver->setUnSAT();
+                               delete iterout;
+                               delete iterin;
+                               return;
+                       }
+                       //Add new order constraint
+                       BooleanEdge orderconstraint = solver->orderConstraint(graph->getOrder(), srcNode->getID(), sinkNode->getID());
+                       solver->addConstraint(orderconstraint);
+
+                       //Add new edge
+                       OrderEdge *newEdge = graph->getOrderEdgeFromOrderGraph(srcNode, sinkNode);
+                       newEdge->mustPos = true;
+                       newEdge->polPos = true;
+                       if (newEdge->mustNeg)
+                               solver->setUnSAT();
+                       srcNode->outEdges.add(newEdge);
+                       sinkNode->inEdges.add(newEdge);
+               }
+               delete iterout;
+       }
+       delete iterin;
+}
+
+void DecomposeOrderTransform::removeMustBeTrueNodes(OrderGraph *graph, HashsetOrderEdge *edgesRemoved) {
+       SetIteratorOrderNode *iterator = graph->getNodes();
+       while (iterator->hasNext()) {
+               OrderNode *node = iterator->next();
+               if (isMustBeTrueNode(node)) {
+                       bypassMustBeTrueNode(graph, node, edgesRemoved);
+               }
+       }
+       delete iterator;
+}
index 1a2865cef6f64033752be24696005db51d4091d5..3f8092fb890bf418624022c98b7ebde3adec00de 100644 (file)
@@ -16,11 +16,16 @@ public:
        DecomposeOrderTransform(CSolver *_solver);
        ~DecomposeOrderTransform();
        void doTransform();
-       void decomposeOrder (Order *currOrder, OrderGraph *currGraph);
 
        CMEMALLOC;
 private:
+       bool isMustBeTrueNode(OrderNode *node);
+       void bypassMustBeTrueNode(OrderGraph *graph, OrderNode *node, HashsetOrderEdge *edgesRemoved);
+       void decomposeOrder(Order *currOrder, OrderGraph *currGraph, HashsetOrderEdge *edgesRemoved, DecomposeOrderResolver *dor);
+       void removeMustBeTrueNodes(OrderGraph *graph, HashsetOrderEdge *edgesRemoved);
 };
 
+
+
 #endif/* ORDERTRANSFORM_H */
 
index 25ef990ee38bca14e5f2aee152382b073eb58e30..1b34bae06a683288a1549fa2b3e0c729e03bb893 100644 (file)
@@ -17,8 +17,8 @@ IntegerEncodingTransform::~IntegerEncodingTransform() {
 
 void IntegerEncodingTransform::doTransform() {
        HashsetOrder *orders = solver->getActiveOrders()->copy();
-       SetIteratorOrder * orderit=orders->iterator();
-       while(orderit->hasNext()) {
+       SetIteratorOrder *orderit = orders->iterator();
+       while (orderit->hasNext()) {
                Order *order = orderit->next();
                if (GETVARTUNABLE(solver->getTuner(), order->type, ORDERINTEGERENCODING, &onoff))
                        integerEncode(order);
index 1e04fd096470f2147727d4ae8d021cf3e57f52e0..1e60c19f244468836eddcd05b1f1436cf3fc6bf8 100644 (file)
@@ -15,10 +15,10 @@ Preprocess::~Preprocess() {
 void Preprocess::doTransform() {
        if (solver->getTuner()->getTunable(PREPROCESS, &onoff) == 0)
                return;
-       
+
        BooleanIterator bit(solver);
-       while(bit.hasNext()) {
-               Boolean *b=bit.next();
+       while (bit.hasNext()) {
+               Boolean *b = bit.next();
                if (b->type == BOOLEANVAR)
                        processBooleanVar((BooleanVar *)b);
        }
@@ -26,7 +26,7 @@ void Preprocess::doTransform() {
 }
 
 void Preprocess::resolveBooleanVars() {
-       SetIteratorBoolean * iterator = toremove.iterator();
+       SetIteratorBoolean *iterator = toremove.iterator();
        while (iterator->hasNext()) {
                BooleanVar *bv = (BooleanVar *) iterator->next();
                if (bv->polarity == P_TRUE) {
@@ -38,9 +38,9 @@ void Preprocess::resolveBooleanVars() {
        delete iterator;
 }
 
-void Preprocess::processBooleanVar(BooleanVar * b) {
-       if (b->polarity==P_TRUE ||
-                       b->polarity==P_FALSE) {
+void Preprocess::processBooleanVar(BooleanVar *b) {
+       if (b->polarity == P_TRUE ||
+                       b->polarity == P_FALSE) {
                toremove.add(b);
        }
 }
index ea9800d8e2b035b426c99e095b30af0485dbcfe5..2bca8bc734177c23d50706838421c69d03f80a9a 100644 (file)
@@ -4,15 +4,15 @@
 #include "transform.h"
 
 class Preprocess : public Transform {
- public:
+public:
        Preprocess(CSolver *_solver);
        ~Preprocess();
        void doTransform();
-       
+
        CMEMALLOC;
- private:
+private:
        HashsetBoolean toremove;
-       void processBooleanVar(BooleanVar * b);
+       void processBooleanVar(BooleanVar *b);
        void resolveBooleanVars();
 };
 
index f018c6c433a5baa358e2f8812fbd73b6837a8040..7c3a094701d3c12ffa08d5a3fba5c83dd6b3f4d8 100644 (file)
@@ -341,11 +341,7 @@ int solveCNF(CNF *cnf) {
        convertPass(cnf, false);
        finishedClauses(cnf->solver);
        long long startSolve = getTimeNano();
-#ifdef TRACE_DEBUG
-        model_println("Backend: Calling the SAT Solver from CSolver ...");
-#endif
-        int result = solve(cnf->solver);
-        model_print("Backend: Result got from SATSolver: %d", result);
+       int result = solve(cnf->solver);
        long long finishTime = getTimeNano();
        cnf->encodeTime = startSolve - startTime;
        cnf->solveTime = finishTime - startSolve;
index abe29cc64bf6144e80d0b7c072053b51bf98ed28..e778247a22915252422c671cf2fb5aae0de041e1 100644 (file)
@@ -15,21 +15,21 @@ OrderPair::OrderPair() :
        constraint(E_NULL) {
 }
 
-OrderPair::~OrderPair(){
+OrderPair::~OrderPair() {
 }
 
-Edge OrderPair::getConstraint(){
+Edge OrderPair::getConstraint() {
        return constraint;
 }
 
-Edge OrderPair::getNegatedConstraint(){
+Edge OrderPair::getNegatedConstraint() {
        return constraintNegate(constraint);
 }
 
-bool OrderPair::getConstraintValue(CSolver* solver){
+bool OrderPair::getConstraintValue(CSolver *solver) {
        return getValueCNF(solver->getSATEncoder()->getCNF(), constraint);
 }
 
-bool OrderPair::getNegatedConstraintValue(CSolver* solver){
+bool OrderPair::getNegatedConstraintValue(CSolver *solver) {
        return getValueCNF(solver->getSATEncoder()->getCNF(), constraintNegate(constraint));
 }
index f65064819da76d111fc87d1eb9862971c7e7fe86..7c1cabdcf962ed8c713fde165e72b28c8c0e204d 100644 (file)
@@ -18,11 +18,11 @@ public:
        OrderPair();
        virtual ~OrderPair();
        virtual Edge getConstraint();
-       virtual bool getConstraintValue(CSolversolver);
+       virtual bool getConstraintValue(CSolver *solver);
        //for the cases that we swap first and second ... For total order is straight forward.
        // but for partial order it has some complexity which should be hidden ... -HG
        virtual Edge getNegatedConstraint();
-       virtual bool getNegatedConstraintValue(CSolversolver);
+       virtual bool getNegatedConstraintValue(CSolver *solver);
        uint64_t first;
        uint64_t second;
        CMEMALLOC;
index 720375db8b1ab5deedcebdfed70bdc5c90691f74..2a58c0682ae57e88e75f39312afcc4378642e40c 100644 (file)
@@ -29,7 +29,6 @@ void SATEncoder::encodeAllSATEncoder(CSolver *csolver) {
        SetIteratorBooleanEdge *iterator = csolver->getConstraints();
        while (iterator->hasNext()) {
                BooleanEdge constraint = iterator->next();
-//                constraint.getBoolean()->print();
                Edge c = encodeConstraintSATEncoder(constraint);
                addConstraintCNF(cnf, c);
        }
@@ -38,7 +37,7 @@ void SATEncoder::encodeAllSATEncoder(CSolver *csolver) {
 
 Edge SATEncoder::encodeConstraintSATEncoder(BooleanEdge c) {
        Edge result;
-       Boolean * constraint = c.getBoolean();
+       Boolean *constraint = c.getBoolean();
 
        if (booledgeMap.contains(constraint)) {
                Edge e = {(Node *) booledgeMap.get(constraint)};
@@ -97,7 +96,7 @@ Edge SATEncoder::encodeLogicSATEncoder(BooleanLogic *constraint) {
        case SATC_OR:
        case SATC_XOR:
        case SATC_IMPLIES:
-               //Don't handle, translate these away...
+       //Don't handle, translate these away...
        default:
                model_print("Unhandled case in encodeLogicSATEncoder %u", constraint->op);
                exit(-1);
index d525bdad0ed0b808d192e8a72004282d77b1c549..56614fabe78a4e953ebebee916c16ae0442b6fce 100644 (file)
@@ -65,7 +65,7 @@ Edge SATEncoder::getPairConstraint(Order *order, OrderPair *pair) {
                flipped.second = pair->first;
                pair = &flipped;
        }
-       OrderPairtmp;
+       OrderPair *tmp;
        if (!(table->contains(pair))) {
                tmp = new OrderPair(pair->first, pair->second, getNewVarSATEncoder());
                table->put(tmp, tmp);
@@ -81,8 +81,8 @@ Edge SATEncoder::getPartialPairConstraint(Order *order, OrderPair *pair) {
                return gvalue;
 
        HashtableOrderPair *table = order->getOrderPairTable();
-       
-       OrderPairtmp;
+
+       OrderPair *tmp;
        if (!(table->contains(pair))) {
                Edge constraint = getNewVarSATEncoder();
                tmp = new OrderPair(pair->first, pair->second, constraint);
@@ -104,7 +104,7 @@ Edge SATEncoder::encodeTotalOrderSATEncoder(BooleanOrder *boolOrder) {
                boolOrder->order->setOrderResolver(new OrderPairResolver(solver, boolOrder->order));
                bool doOptOrderStructure = GETVARTUNABLE(solver->getTuner(), boolOrder->order->type, OPTIMIZEORDERSTRUCTURE, &onoff);
                if (doOptOrderStructure) {
-                        ASSERT(boolOrder->order->graph == NULL);
+                       ASSERT(boolOrder->order->graph == NULL);
                        boolOrder->order->graph = buildMustOrderGraph(boolOrder->order);
                        reachMustAnalysis(solver, boolOrder->order->graph, true);
                }
@@ -153,7 +153,7 @@ Edge SATEncoder::generatePartialOrderConstraintsSATEncoder(Edge ij,Edge ji, Edge
        Edge uoIJ = constraintAND2(cnf, constraintNegate(ij), constraintNegate(ji));
        Edge uoJK = constraintAND2(cnf, constraintNegate(jk), constraintNegate(kj));
        Edge uoIK = constraintAND2(cnf, constraintNegate(ik), constraintNegate(ki));
-               
+
        Edge t1[] = {ij, jk, ik};
        Edge t2[] = {ji, jk, ik};
        Edge t3[] = {ij, kj, ki};
@@ -166,7 +166,7 @@ Edge SATEncoder::generatePartialOrderConstraintsSATEncoder(Edge ij,Edge ji, Edge
        Edge ct4 = constraintAND(cnf, 3, t4);
        Edge ct5 = constraintAND(cnf, 3, t5);
        Edge ct6 = constraintAND(cnf, 3, t6);
-       
+
        Edge p1[] = {uoIJ, jk, ik};
        Edge p2[] = {ij, kj, uoIK};
        Edge p3[] = {ji, uoJK, ki};
@@ -179,7 +179,7 @@ Edge SATEncoder::generatePartialOrderConstraintsSATEncoder(Edge ij,Edge ji, Edge
        Edge cp4 = constraintAND(cnf, 3, p4);
        Edge cp5 = constraintAND(cnf, 3, p5);
        Edge cp6 = constraintAND(cnf, 3, p6);
-       
+
        Edge o1[] = {uoIJ, uoJK, ik};
        Edge o2[] = {ij, uoJK, uoIK};
        Edge o3[] = {uoIK, jk, uoIK};
@@ -192,15 +192,15 @@ Edge SATEncoder::generatePartialOrderConstraintsSATEncoder(Edge ij,Edge ji, Edge
        Edge co4 = constraintAND(cnf, 3, o4);
        Edge co5 = constraintAND(cnf, 3, o5);
        Edge co6 = constraintAND(cnf, 3, o6);
-       
+
        Edge unorder [] = {uoIJ, uoJK, uoIK};
        Edge cunorder = constraintAND(cnf, 3, unorder);
-       
-       
+
+
        Edge res[] = {ct1,ct2,ct3,ct4,ct5,ct6,
-                       cp1,cp2,cp3,cp4,cp5,cp6,
-                       co1,co2,co3,co4,co5,co6,
-                       cunorder};
+                                                               cp1,cp2,cp3,cp4,cp5,cp6,
+                                                               co1,co2,co3,co4,co5,co6,
+                                                               cunorder};
        return constraintOR(cnf, 19, res);
 }
 
@@ -248,7 +248,7 @@ void SATEncoder::createAllPartialOrderConstraintsSATEncoder(Order *order) {
                                Edge constKI = getPartialPairConstraint(order, &pairKI);
                                Edge constKJ = getPartialPairConstraint(order, &pairKJ);
                                addConstraintCNF(cnf, generatePartialOrderConstraintsSATEncoder(constIJ, constJI,
-                                       constJK, constKJ, constIK, constKI));
+                                                                                                                                                                                                                                                                                               constJK, constKJ, constIK, constKI));
                        }
                }
        }
index 5e8a7de935b8f1e3818ed156efc9d03c7cb150f0..7a8104dcd4453e6994c6fee547e50d0d488028e7 100644 (file)
 #define PTRSHIFT 5
 
 class BooleanEdge {
- public:
- BooleanEdge() : b(NULL) {}
BooleanEdge(Boolean * _b) : b(_b) {}
+public:
      BooleanEdge() : b(NULL) {}
      BooleanEdge(Boolean *_b) : b(_b) {}
        BooleanEdge negate() {return BooleanEdge((Boolean *)(((uintptr_t) b) ^ 1));}
-       bool operator==(BooleanEdge e) { return b==e.b;}
-       bool operator!=(BooleanEdge e) { return b!=e.b;}
+       bool operator==(BooleanEdge e) { return b == e.b;}
+       bool operator!=(BooleanEdge e) { return b != e.b;}
        bool isNegated() { return ((uintptr_t) b) & 1; }
-       Boolean * getBoolean() {return (Boolean *)(((uintptr_t)b) & ~((uintptr_t) 1));}
-       Boolean * getRaw() {return b;}
-       Boolean * operator->() {return getBoolean();}
+       Boolean *getBoolean() {return (Boolean *)(((uintptr_t)b) & ~((uintptr_t) 1));}
+       Boolean *getRaw() {return b;}
+       Boolean *operator->() {return getBoolean();}
        operator bool() const {return b != NULL;}
- private:
+private:
        Boolean *b;
 };
 
 inline bool boolEdgeEquals(BooleanEdge b1, BooleanEdge b2) {
-       return b1==b2;
+       return b1 == b2;
 }
 
 inline unsigned int boolEdgeHash(BooleanEdge b) {
-       return (unsigned int) (((uintptr_t)b.getRaw())>>PTRSHIFT);
+       return (unsigned int) (((uintptr_t)b.getRaw()) >> PTRSHIFT);
 }
-                                                                       
-typedef Hashset<BooleanEdge, uintptr_t, PTRSHIFT, & boolEdgeHash, & boolEdgeEquals> HashsetBooleanEdge;
+
+typedef Hashset<BooleanEdge, uintptr_t, PTRSHIFT, &boolEdgeHash, &boolEdgeEquals> HashsetBooleanEdge;
 typedef Hashset<Order *, uintptr_t, PTRSHIFT> HashsetOrder;
-typedef SetIterator<BooleanEdge, uintptr_t, PTRSHIFT, & boolEdgeHash, & boolEdgeEquals> SetIteratorBooleanEdge;
+typedef SetIterator<BooleanEdge, uintptr_t, PTRSHIFT, &boolEdgeHash, &boolEdgeEquals> SetIteratorBooleanEdge;
 typedef SetIterator<Order *, uintptr_t, PTRSHIFT> SetIteratorOrder;
 
 #endif
index 13edbf95895e589d88fb4d548e575e7cf677408c..86cbce90530034c52b19364a68426b1588dc521a 100644 (file)
@@ -117,6 +117,17 @@ public:
                table->reset();
        }
 
+       void resetAndDelete() {
+               Linknode<_Key> *tmp = list;
+               while (tmp != NULL) {
+                       Linknode<_Key> *tmpnext = tmp->next;
+                       ourfree(tmp);
+                       tmp = tmpnext;
+               }
+               list = tail = NULL;
+               table->resetAndDeleteKeys();
+       }
+
        /** @brief Adds a new key to the hashset.  Returns false if the key
         *  is already present. */
 
index 44b984daafea43a9b9ab943ea23d04dc025ea531..218fb2d6d17f653004baaeecdef7cf59dee549b1 100644 (file)
@@ -126,7 +126,25 @@ public:
                }
        }
 
-       void resetanddelete() {
+       void resetAndDeleteKeys() {
+               for (unsigned int i = 0; i < capacity; i++) {
+                       struct Hashlistnode<_Key, _Val> *bin = &table[i];
+                       if (bin->key != NULL) {
+                               delete bin->key;
+                               bin->key = NULL;
+                               if (bin->val != NULL) {
+                                       bin->val = NULL;
+                               }
+                       }
+               }
+               if (zero) {
+                       ourfree(zero);
+                       zero = NULL;
+               }
+               size = 0;
+       }
+
+       void resetAndDeleteVals() {
                for (unsigned int i = 0; i < capacity; i++) {
                        struct Hashlistnode<_Key, _Val> *bin = &table[i];
                        if (bin->key != NULL) {
@@ -146,7 +164,7 @@ public:
                size = 0;
        }
 
-       void resetandfree() {
+       void resetAndFreeVals() {
                for (unsigned int i = 0; i < capacity; i++) {
                        struct Hashlistnode<_Key, _Val> *bin = &table[i];
                        if (bin->key != NULL) {
index 0c415b51aa93bb1af3fef8e65bc3c932240cc3c0..f4e7ec9facde6e54c839e1df00309a720193f0fe 100644 (file)
  * isn't worth optimizing; the SWAP's get sped up by the cache, and pointer
  * arithmetic gets lost in the time required for comparison function calls.
  */
-#define        SWAP(a, b, count, size, tmp) { \
-       count = size; \
-       do { \
-               tmp = *a; \
-               *a++ = *b; \
-               *b++ = tmp; \
-       } while (--count); \
+#define SWAP(a, b, count, size, tmp) { \
+               count = size; \
+               do { \
+                       tmp = *a; \
+                       *a++ = *b; \
+                       *b++ = tmp; \
+               } while (--count); \
 }
 
 /* Copy one block of size size to another. */
 #define COPY(a, b, count, size, tmp1, tmp2) { \
-       count = size; \
-       tmp1 = a; \
-       tmp2 = b; \
-       do { \
-               *tmp1++ = *tmp2++; \
-       } while (--count); \
+               count = size; \
+               tmp1 = a; \
+               tmp2 = b; \
+               do { \
+                       *tmp1++ = *tmp2++; \
+               } while (--count); \
 }
 
 /*
  * j < nmemb, select largest of Ki, Kj and Kj+1.
  */
 #define CREATE(initval, nmemb, par_i, child_i, par, child, size, count, tmp) { \
-       for (par_i = initval; (child_i = par_i * 2) <= nmemb; \
-           par_i = child_i) { \
-               child = base + child_i * size; \
-               if (child_i < nmemb && compar(child, child + size) < 0) { \
-                       child += size; \
-                       ++child_i; \
+               for (par_i = initval; (child_i = par_i * 2) <= nmemb; \
+                                par_i = child_i) { \
+                       child = base + child_i * size; \
+                       if (child_i < nmemb && compar(child, child + size) < 0) { \
+                               child += size; \
+                               ++child_i; \
+                       } \
+                       par = base + par_i * size; \
+                       if (compar(child, par) <= 0) \
+                               break; \
+                       SWAP(par, child, count, size, tmp); \
                } \
-               par = base + par_i * size; \
-               if (compar(child, par) <= 0) \
-                       break; \
-               SWAP(par, child, count, size, tmp); \
-       } \
 }
 
 /*
  * XXX Don't break the #define SELECT line, below.  Reiser cpp gets upset.
  */
 #define SELECT(par_i, child_i, nmemb, par, child, size, k, count, tmp1, tmp2) { \
-       for (par_i = 1; (child_i = par_i * 2) <= nmemb; par_i = child_i) { \
-               child = base + child_i * size; \
-               if (child_i < nmemb && compar(child, child + size) < 0) { \
-                       child += size; \
-                       ++child_i; \
+               for (par_i = 1; (child_i = par_i * 2) <= nmemb; par_i = child_i) { \
+                       child = base + child_i * size; \
+                       if (child_i < nmemb && compar(child, child + size) < 0) { \
+                               child += size; \
+                               ++child_i; \
+                       } \
+                       par = base + par_i * size; \
+                       COPY(par, child, count, size, tmp1, tmp2); \
                } \
-               par = base + par_i * size; \
-               COPY(par, child, count, size, tmp1, tmp2); \
-       } \
-       for (;;) { \
-               child_i = par_i; \
-               par_i = child_i / 2; \
-               child = base + child_i * size; \
-               par = base + par_i * size; \
-               if (child_i == 1 || compar(k, par) < 0) { \
-                       COPY(child, k, count, size, tmp1, tmp2); \
-                       break; \
+               for (;; ) { \
+                       child_i = par_i; \
+                       par_i = child_i / 2; \
+                       child = base + child_i * size; \
+                       par = base + par_i * size; \
+                       if (child_i == 1 || compar(k, par) < 0) { \
+                               COPY(child, k, count, size, tmp1, tmp2); \
+                               break; \
+                       } \
+                       COPY(child, par, count, size, tmp1, tmp2); \
                } \
-               COPY(child, par, count, size, tmp1, tmp2); \
-       } \
 }
 
 /*
  */
 int
 bsdheapsort(void *vbase, size_t nmemb, size_t size,
-    int (*compar)(const void *, const void *))
+                                               int (*compar)(const void *, const void *))
 {
        size_t cnt, i, j, l;
        char tmp, *tmp1, *tmp2;
@@ -188,7 +188,7 @@ bsdheapsort(void *vbase, size_t nmemb, size_t size,
         */
        base = (char *)vbase - size;
 
-       for (l = nmemb / 2 + 1; --l;)
+       for (l = nmemb / 2 + 1; --l; )
                CREATE(l, nmemb, i, j, t, p, size, cnt, tmp);
 
        /*
@@ -207,10 +207,10 @@ bsdheapsort(void *vbase, size_t nmemb, size_t size,
 }
 
 
-static __inline char   *med3(char *, char *, char *, int (*)(const void *, const void *));
-static __inline void    swapfunc(char *, char *, size_t, int);
+static __inline char  *med3(char *, char *, char *, int (*)(const void *, const void *));
+static __inline void swapfunc(char *, char *, size_t, int);
 
-#define min(a, b)      (a) < (b) ? a : b
+#define min(a, b) (a) < (b) ? a : b
 
 /*
  * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function".
@@ -230,24 +230,24 @@ static __inline void       swapfunc(char *, char *, size_t, int);
  *   4. Tail recursion is eliminated when sorting the larger of two
  *     subpartitions to save stack space.
  */
-#define SWAPTYPE_BYTEV 1
-#define SWAPTYPE_INTV  2
-#define SWAPTYPE_LONGV 3
-#define SWAPTYPE_INT   4
-#define SWAPTYPE_LONG  5
+#define SWAPTYPE_BYTEV  1
+#define SWAPTYPE_INTV 2
+#define SWAPTYPE_LONGV  3
+#define SWAPTYPE_INT  4
+#define SWAPTYPE_LONG 5
 
-#define TYPE_ALIGNED(TYPE, a, es)                      \
+#define TYPE_ALIGNED(TYPE, a, es)     \
        (((char *)a - (char *)0) % sizeof(TYPE) == 0 && es % sizeof(TYPE) == 0)
 
-#define swapcode(TYPE, parmi, parmj, n) {              \
-       size_t i = (n) / sizeof (TYPE);                 \
-       TYPE *pi = (TYPE *) (parmi);                    \
-       TYPE *pj = (TYPE *) (parmj);                    \
-       do {                                            \
-               TYPE    t = *pi;                        \
-               *pi++ = *pj;                            \
-               *pj++ = t;                              \
-        } while (--i > 0);                             \
+#define swapcode(TYPE, parmi, parmj, n) {     \
+               size_t i = (n) / sizeof (TYPE);     \
+               TYPE *pi = (TYPE *) (parmi);      \
+               TYPE *pj = (TYPE *) (parmj);      \
+               do {            \
+                       TYPE t = *pi;      \
+                       *pi++ = *pj;        \
+                       *pj++ = t;        \
+               } while (--i > 0);        \
 }
 
 static __inline void
@@ -268,47 +268,47 @@ swapfunc(char *a, char *b, size_t n, int swaptype)
        }
 }
 
-#define swap(a, b)     do {                            \
-       switch (swaptype) {                             \
-       case SWAPTYPE_INT: {                            \
-               int t = *(int *)(a);                    \
-               *(int *)(a) = *(int *)(b);              \
-               *(int *)(b) = t;                        \
-               break;                                  \
-           }                                           \
-       case SWAPTYPE_LONG: {                           \
-               long t = *(long *)(a);                  \
-               *(long *)(a) = *(long *)(b);            \
-               *(long *)(b) = t;                       \
-               break;                                  \
-           }                                           \
-       default:                                        \
-               swapfunc(a, b, es, swaptype);           \
-       }                                               \
+#define swap(a, b)  do {        \
+               switch (swaptype) {       \
+               case SWAPTYPE_INT: {        \
+                       int t = *(int *)(a);      \
+                       *(int *)(a) = *(int *)(b);    \
+                       *(int *)(b) = t;      \
+                       break;          \
+               }           \
+               case SWAPTYPE_LONG: {       \
+                       long t = *(long *)(a);      \
+                       *(long *)(a) = *(long *)(b);    \
+                       *(long *)(b) = t;     \
+                       break;          \
+               }           \
+               default:          \
+                       swapfunc(a, b, es, swaptype);   \
+               }           \
 } while (0)
 
-#define vecswap(a, b, n)       if ((n) > 0) swapfunc(a, b, n, swaptype)
+#define vecswap(a, b, n)  if ((n) > 0) swapfunc(a, b, n, swaptype)
 
 static __inline char *
 med3(char *a, char *b, char *c, int (*cmp)(const void *, const void *))
 {
        return cmp(a, b) < 0 ?
-              (cmp(b, c) < 0 ? b : (cmp(a, c) < 0 ? c : a ))
-              :(cmp(b, c) > 0 ? b : (cmp(a, c) < 0 ? a : c ));
+                                (cmp(b, c) < 0 ? b : (cmp(a, c) < 0 ? c : a))
+                                : (cmp(b, c) > 0 ? b : (cmp(a, c) < 0 ? a : c));
 }
 
 static void
 introsort(char *a, size_t n, size_t es, size_t maxdepth, int swaptype,
-    int (*cmp)(const void *, const void *))
+                                       int (*cmp)(const void *, const void *))
 {
        char *pa, *pb, *pc, *pd, *pl, *pm, *pn;
        int cmp_result;
        size_t r, s;
 
-loop:  if (n < 7) {
+loop: if (n < 7) {
                for (pm = a + es; pm < a + n * es; pm += es)
                        for (pl = pm; pl > a && cmp(pl - es, pl) > 0;
-                            pl -= es)
+                                        pl -= es)
                                swap(pl, pl - es);
                return;
        }
@@ -332,7 +332,7 @@ loop:       if (n < 7) {
        swap(a, pm);
        pa = pb = a + es;
        pc = pd = a + (n - 1) * es;
-       for (;;) {
+       for (;; ) {
                while (pb <= pc && (cmp_result = cmp(pb, a)) <= 0) {
                        if (cmp_result == 0) {
                                swap(pa, pb);
@@ -370,7 +370,7 @@ loop:       if (n < 7) {
                if (s > es) {
                        if (r > es) {
                                introsort(a, r / es, es, maxdepth,
-                                   swaptype, cmp);
+                                                                       swaptype, cmp);
                        }
                        a = pn - s;
                        n = s / es;
@@ -381,7 +381,7 @@ loop:       if (n < 7) {
                if (r > es) {
                        if (s > es) {
                                introsort(pn - s, s / es, es, maxdepth,
-                                   swaptype, cmp);
+                                                                       swaptype, cmp);
                        }
                        n = r / es;
                        goto loop;
index 96b85e7dc1aedb6fd9ae8228ed63f31582777af4..20012421f8eab831957682b8cff4fbf65dfc08a4 100644 (file)
@@ -6,6 +6,7 @@
 #include "ordergraph.h"
 #include "orderelement.h"
 #include "structs.h"
+#include "decomposeorderresolver.h"
 
 unsigned int table_entry_hash_function(TableEntry *This) {
        unsigned int h = 0;
@@ -56,3 +57,12 @@ unsigned int order_pair_hash_function(OrderPair *This) {
 bool order_pair_equals(OrderPair *key1, OrderPair *key2) {
        return key1->first == key2->first && key1->second == key2->second;
 }
+
+unsigned int doredge_hash_function(DOREdge *key) {
+       return (uint) (key->newfirst << 2) ^ key->newsecond;
+}
+
+bool doredge_equals(DOREdge *key1, DOREdge *key2) {
+       return key1->newfirst == key2->newfirst &&
+                                key1->newsecond == key2->newsecond;
+}
index 6d06f549d616b3b869d0022b5b6938ced17a12fa..2515f8f09969907fd7411004bbad782fdd4a8002 100644 (file)
@@ -19,11 +19,15 @@ bool order_element_equals(OrderElement *key1, OrderElement *key2);
 unsigned int order_pair_hash_function(OrderPair *This);
 bool order_pair_equals(OrderPair *key1, OrderPair *key2);
 
+unsigned int doredge_hash_function(DOREdge *key);
+bool doredge_equals(DOREdge *key1, DOREdge *key2);
+
 
 typedef Hashset<TableEntry *, uintptr_t, PTRSHIFT, table_entry_hash_function, table_entry_equals> HashsetTableEntry;
 typedef Hashset<OrderNode *, uintptr_t, PTRSHIFT, order_node_hash_function, order_node_equals> HashsetOrderNode;
 typedef Hashset<OrderEdge *, uintptr_t, PTRSHIFT, order_edge_hash_function, order_edge_equals> HashsetOrderEdge;
 typedef Hashset<OrderElement *, uintptr_t, PTRSHIFT, order_element_hash_function, order_element_equals> HashsetOrderElement;
+typedef Hashset<DOREdge *, uintptr_t, PTRSHIFT, doredge_hash_function, doredge_equals> HashsetDOREdge;
 typedef Hashset<Boolean *, uintptr_t, PTRSHIFT> HashsetBoolean;
 typedef Hashset<Element *, uintptr_t, PTRSHIFT> HashsetElement;
 typedef SetIterator<Boolean *, uintptr_t, PTRSHIFT> SetIteratorBoolean;
@@ -43,5 +47,5 @@ typedef SetIterator<TableEntry *, uintptr_t, PTRSHIFT, table_entry_hash_function
 typedef SetIterator<OrderEdge *, uintptr_t, PTRSHIFT, order_edge_hash_function, order_edge_equals> SetIteratorOrderEdge;
 typedef SetIterator<OrderNode *, uintptr_t, PTRSHIFT, order_node_hash_function, order_node_equals> SetIteratorOrderNode;
 typedef SetIterator<OrderElement *, uintptr_t, PTRSHIFT, order_element_hash_function, order_element_equals> SetIteratorOrderElement;
-
+typedef SetIterator<DOREdge *, uintptr_t, PTRSHIFT, doredge_hash_function, doredge_equals> SetIteratorDOREdge;
 #endif
index 80ec9182c9e1d29ee21acdf6e86af75eb24aa865..6c532532c8e39a3f115c61900d7fdfa0bfc894ce 100644 (file)
@@ -81,7 +81,7 @@
        void setVector ## name(Vector ## name * vector, uint index, type item) { \
                vector->array[index] = item;                                          \
        }                                                                     \
-       uint getSizeVector ## name(const Vector ## name * vector) {                                             \
+       uint getSizeVector ## name(const Vector ## name * vector) {           \
                return vector->size;                                                \
        }                                                                     \
        void deleteVector ## name(Vector ## name * vector) {                     \
index 66a97d08602672d2eed1390f4788b7b50249bfa0..19439dc426e88933e13a4561d878398316611cc8 100644 (file)
@@ -5,6 +5,8 @@
 #include "satencoder.h"
 #include "set.h"
 
+const char *elemEncTypeNames[] = {"UNASSIGNED", "ONEHOT", "UNARY", "BINARYINDEX", "BINARYVAL"};
+
 ElementEncoding::ElementEncoding(Element *_element) :
        type(ELEM_UNASSIGNED),
        element(_element),
@@ -49,3 +51,17 @@ void ElementEncoding::encodingArrayInitialization() {
                setInUseElement(i);
        }
 }
+
+void ElementEncoding::print() {
+       model_print("%s ", elemEncTypeNames[type]);
+       if (type == BINARYINDEX) {
+               for (uint i = 0; i < encArraySize; i++) {
+                       if (i != 0)
+                               model_print(", ");
+                       if (isinUseElement(i))
+                               model_print("%" PRIu64 "", encodingArray[i]);
+                       else
+                               model_print("_");
+               }
+       }
+}
index 6797c66bf530b9024fba0fd3627f43643799ce04..b066de34a341636eb7039d89b3bc5733c3bc030e 100644 (file)
@@ -29,7 +29,7 @@ public:
                }
                return -1;
        }
-
+       void print();
 
        ElementEncodingType type;
        Element *element;
index ace03131718e8e35b9a6d4f855eb656f5dc33183..e42f398a604c1a548ebe6af3476a2e2a6eaa0703 100644 (file)
@@ -28,7 +28,7 @@ void naiveEncodingConstraint(Boolean *This) {
                return;
        }
        case ORDERCONST: {
-               if(((BooleanOrder *) This)->order->encoding.type == ORDER_UNASSIGNED)
+               if (((BooleanOrder *) This)->order->encoding.type == ORDER_UNASSIGNED)
                        ((BooleanOrder *) This)->order->setOrderEncodingType(PAIRWISE);
                return;
        }
index 556554e8d7d3f06f55aab5cf1f42f57ed2277ff3..e3c150a363927ba063500374b1254d1016e2e755 100644 (file)
@@ -8,8 +8,8 @@ OrderEncoding::OrderEncoding(Order *_order) :
 {
 }
 
-OrderEncoding::~OrderEncoding(){
-       if(resolver!= NULL){
+OrderEncoding::~OrderEncoding() {
+       if (resolver != NULL) {
                delete resolver;
        }
 }
index bffb901153216f812f6797d3265618e5c48b4196..6f14484c95646b2da6752ef9cb77e8d2fa27b437 100644 (file)
@@ -1,8 +1,8 @@
 
-/* 
+/*
  * File:   deserializer.cc
  * Author: hamed
- * 
+ *
  * Created on September 7, 2017, 6:08 PM
  */
 
 #include "element.h"
 #include "mutableset.h"
 
-Deserializer::Deserializer(const char* file):
+Deserializer::Deserializer(const char *file) :
        solver(new CSolver())
 {
        filedesc = open(file, O_RDONLY);
+
        if (filedesc < 0) {
                exit(-1);
        }
@@ -27,98 +27,98 @@ Deserializer::Deserializer(const char* file):
 
 Deserializer::~Deserializer() {
        delete solver;
-       
-       if (-1 == close(filedesc)){
+
+       if (-1 == close(filedesc)) {
                exit(-1);
        }
 }
 
-ssize_t Deserializer::myread(void* __buf, size_t __nbytes){
+ssize_t Deserializer::myread(void *__buf, size_t __nbytes) {
        return read (filedesc, __buf, __nbytes);
 }
 
-CSolver * Deserializer::deserialize(){
+CSolver *Deserializer::deserialize() {
        ASTNodeType nodeType;
-       while(myread(&nodeType, sizeof(ASTNodeType) ) >0){
-               switch(nodeType){
-                       case BOOLEANEDGE:
-                               deserializeBooleanEdge();
-                               break;
-                       case BOOLEANVAR:
-                               deserializeBooleanVar();
-                               break;
-                       case ORDERCONST:
-                               deserializeBooleanOrder();
-                               break;
-                       case ORDERTYPE:
-                               deserializeOrder();
-                               break;
-                       case SETTYPE:
-                               deserializeSet();
-                               break;
-                       case LOGICOP:
-                               deserializeBooleanLogic();
-                               break;
-                       case PREDICATEOP:
-                               deserializeBooleanPredicate();
-                               break;
-                       case PREDTABLETYPE:
-                               deserializePredicateTable();
-                               break;
-                       case PREDOPERTYPE:
-                               deserializePredicateOperator();
-                               break;
-                       case TABLETYPE:
-                               deserializeTable();
-                               break;
-                       case ELEMSET:
-                               deserializeElementSet();
-                               break;
-                       case ELEMCONST:
-                               deserializeElementConst();
-                               break;
-                       case ELEMFUNCRETURN:
-                               deserializeElementFunction();
-                               break;
-                       case FUNCOPTYPE:
-                               deserializeFunctionOperator();
-                               break;
-                       case FUNCTABLETYPE:
-                               deserializeFunctionTable();
-                               break;
-                       default:
-                               ASSERT(0);
+       while (myread(&nodeType, sizeof(ASTNodeType) ) > 0) {
+               switch (nodeType) {
+               case BOOLEANEDGE:
+                       deserializeBooleanEdge();
+                       break;
+               case BOOLEANVAR:
+                       deserializeBooleanVar();
+                       break;
+               case ORDERCONST:
+                       deserializeBooleanOrder();
+                       break;
+               case ORDERTYPE:
+                       deserializeOrder();
+                       break;
+               case SETTYPE:
+                       deserializeSet();
+                       break;
+               case LOGICOP:
+                       deserializeBooleanLogic();
+                       break;
+               case PREDICATEOP:
+                       deserializeBooleanPredicate();
+                       break;
+               case PREDTABLETYPE:
+                       deserializePredicateTable();
+                       break;
+               case PREDOPERTYPE:
+                       deserializePredicateOperator();
+                       break;
+               case TABLETYPE:
+                       deserializeTable();
+                       break;
+               case ELEMSET:
+                       deserializeElementSet();
+                       break;
+               case ELEMCONST:
+                       deserializeElementConst();
+                       break;
+               case ELEMFUNCRETURN:
+                       deserializeElementFunction();
+                       break;
+               case FUNCOPTYPE:
+                       deserializeFunctionOperator();
+                       break;
+               case FUNCTABLETYPE:
+                       deserializeFunctionTable();
+                       break;
+               default:
+                       ASSERT(0);
                }
        }
        return solver;
 }
 
-void Deserializer::deserializeBooleanEdge(){
+void Deserializer::deserializeBooleanEdge() {
        Boolean *b;
-       myread(&b, sizeof(Boolean*));
+       myread(&b, sizeof(Boolean *));
        BooleanEdge tmp(b);
        bool isNegated = tmp.isNegated();
        ASSERT(map.contains(tmp.getBoolean()));
-       b = (Boolean*) map.get(tmp.getBoolean());
+       b = (Boolean *) map.get(tmp.getBoolean());
        BooleanEdge res(b);
-       solver->addConstraint(isNegated?res.negate():res);
+       solver->addConstraint(isNegated ? res.negate() : res);
 }
 
-void Deserializer::deserializeBooleanVar(){
+void Deserializer::deserializeBooleanVar() {
        BooleanVar *b;
-       myread(&b, sizeof(BooleanVar*));
+       myread(&b, sizeof(BooleanVar *));
        VarType vtype;
        myread(&vtype, sizeof(VarType));
        map.put(b, solver->getBooleanVar(vtype).getBoolean());
 }
 
-void Deserializer::deserializeBooleanOrder(){
-       BooleanOrderbo_ptr;
-       myread(&bo_ptr, sizeof(BooleanOrder*));
-       Orderorder;
-       myread(&order, sizeof(Order*));
+void Deserializer::deserializeBooleanOrder() {
+       BooleanOrder *bo_ptr;
+       myread(&bo_ptr, sizeof(BooleanOrder *));
+       Order *order;
+       myread(&order, sizeof(Order *));
        ASSERT(map.contains(order));
-       order  = (Order*) map.get(order);
+       order  = (Order *) map.get(order);
        uint64_t first;
        myread(&first, sizeof(uint64_t));
        uint64_t second;
@@ -126,21 +126,21 @@ void Deserializer::deserializeBooleanOrder(){
        map.put(bo_ptr, solver->orderConstraint(order, first, second).getBoolean());
 }
 
-void Deserializer::deserializeOrder(){
-       Ordero_ptr;
-       myread(&o_ptr, sizeof(Order*));
+void Deserializer::deserializeOrder() {
+       Order *o_ptr;
+       myread(&o_ptr, sizeof(Order *));
        OrderType type;
        myread(&type, sizeof(OrderType));
-       Set * set_ptr;
+       Set *set_ptr;
        myread(&set_ptr, sizeof(Set *));
        ASSERT(map.contains(set_ptr));
-       Set* set  = (Set*) map.get(set_ptr);
+       Set *set  = (Set *) map.get(set_ptr);
        map.put(o_ptr, solver->createOrder(type, set));
 }
 
-void Deserializer::deserializeSet(){
+void Deserializer::deserializeSet() {
        Set *s_ptr;
-       myread(&s_ptr, sizeof(Set*));
+       myread(&s_ptr, sizeof(Set *));
        VarType type;
        myread(&type, sizeof(VarType));
        bool isRange;
@@ -175,10 +175,9 @@ void Deserializer::deserializeSet(){
                 }
                 map.put(s_ptr, set);
         }
-       
 }
 
-void Deserializer::deserializeBooleanLogic(){
+void Deserializer::deserializeBooleanLogic() {
        BooleanLogic *bl_ptr;
        myread(&bl_ptr, sizeof(BooleanLogic *));
        LogicOp op;
@@ -186,134 +185,134 @@ void Deserializer::deserializeBooleanLogic(){
        uint size;
        myread(&size, sizeof(uint));
        Vector<BooleanEdge> members;
-       for(uint i=0; i<size; i++){
-               Booleanmember;
+       for (uint i = 0; i < size; i++) {
+               Boolean *member;
                myread(&member, sizeof(Boolean *));
                BooleanEdge tmp(member);
                bool isNegated = tmp.isNegated();
                ASSERT(map.contains(tmp.getBoolean()));
-               member = (Boolean*) map.get(tmp.getBoolean());
+               member = (Boolean *) map.get(tmp.getBoolean());
                BooleanEdge res(member);
-               members.push( isNegated?res.negate():res );
+               members.push( isNegated ? res.negate() : res );
        }
        map.put(bl_ptr, solver->applyLogicalOperation(op, members.expose(), size).getBoolean());
 }
 
-void Deserializer::deserializeBooleanPredicate(){
+void Deserializer::deserializeBooleanPredicate() {
        BooleanPredicate *bp_ptr;
        myread(&bp_ptr, sizeof(BooleanPredicate *));
-       Predicatepredicate;
-       myread(&predicate, sizeof(Predicate*));
+       Predicate *predicate;
+       myread(&predicate, sizeof(Predicate *));
        ASSERT(map.contains(predicate));
-       predicate = (Predicate*) map.get(predicate);
+       predicate = (Predicate *) map.get(predicate);
        uint size;
        myread(&size, sizeof(uint));
-       Vector<Element*> members;
-       for(uint i=0; i<size; i++){
-               Elementinput;
+       Vector<Element *> members;
+       for (uint i = 0; i < size; i++) {
+               Element *input;
                myread(&input, sizeof(Element *));
                ASSERT(map.contains(input));
-               input = (Element*) map.get(input);
+               input = (Element *) map.get(input);
                members.push(input);
        }
-       
-       Booleanstat_ptr;
+
+       Boolean *stat_ptr;
        myread(&stat_ptr, sizeof(Boolean *));
        BooleanEdge undefStatus;
-       if(stat_ptr != NULL){
+       if (stat_ptr != NULL) {
                BooleanEdge tmp(stat_ptr);
                bool isNegated = tmp.isNegated();
                ASSERT(map.contains(tmp.getBoolean()));
-               stat_ptr = (Boolean*) map.get(tmp.getBoolean());
+               stat_ptr = (Boolean *) map.get(tmp.getBoolean());
                BooleanEdge res(stat_ptr);
-               undefStatus = isNegated?res.negate():res;
+               undefStatus = isNegated ? res.negate() : res;
        } else {
                undefStatus = NULL;
        }
        map.put(bp_ptr, solver->applyPredicateTable(predicate, members.expose(), size, undefStatus).getBoolean());
 }
 
-void Deserializer::deserializePredicateTable(){
+void Deserializer::deserializePredicateTable() {
        PredicateTable *pt_ptr;
        myread(&pt_ptr, sizeof(PredicateTable *));
-       Tabletable;
-       myread(&table, sizeof(Table*));
+       Table *table;
+       myread(&table, sizeof(Table *));
        ASSERT(map.contains(table));
-       table = (Table*) map.get(table);
+       table = (Table *) map.get(table);
        UndefinedBehavior undefinedbehavior;
        myread(&undefinedbehavior, sizeof(UndefinedBehavior));
-       
+
        map.put(pt_ptr, solver->createPredicateTable(table, undefinedbehavior));
 }
 
-void Deserializer::deserializePredicateOperator(){
+void Deserializer::deserializePredicateOperator() {
        PredicateOperator *po_ptr;
        myread(&po_ptr, sizeof(PredicateOperator *));
        CompOp op;
        myread(&op, sizeof(CompOp));
        uint size;
        myread(&size, sizeof(uint));
-       Vector<Set*> domains;
-       for(uint i=0; i<size; i++){
-               Setdomain;
-               myread(&domain, sizeof(Set*));
+       Vector<Set *> domains;
+       for (uint i = 0; i < size; i++) {
+               Set *domain;
+               myread(&domain, sizeof(Set *));
                ASSERT(map.contains(domain));
-               domain = (Set*) map.get(domain);
+               domain = (Set *) map.get(domain);
                domains.push(domain);
        }
 
        map.put(po_ptr, solver->createPredicateOperator(op, domains.expose(), size));
 }
 
-void Deserializer::deserializeTable(){
+void Deserializer::deserializeTable() {
        Table *t_ptr;
        myread(&t_ptr, sizeof(Table *));
        uint size;
        myread(&size, sizeof(uint));
-       Vector<Set*> domains;
-       for(uint i=0; i<size; i++){
-               Setdomain;
-               myread(&domain, sizeof(Set*));
+       Vector<Set *> domains;
+       for (uint i = 0; i < size; i++) {
+               Set *domain;
+               myread(&domain, sizeof(Set *));
                ASSERT(map.contains(domain));
-               domain = (Set*) map.get(domain);
+               domain = (Set *) map.get(domain);
                domains.push(domain);
        }
-       Setrange;
-       myread(&range, sizeof(Set*));
-       if(range != NULL){
+       Set *range;
+       myread(&range, sizeof(Set *));
+       if (range != NULL) {
                ASSERT(map.contains(range));
-               range = (Set*) map.get(range);
+               range = (Set *) map.get(range);
        }
-       Tabletable = solver->createTable(domains.expose(), size, range);
+       Table *table = solver->createTable(domains.expose(), size, range);
        myread(&size, sizeof(uint));
-       for(uint i=0; i<size; i++){
+       for (uint i = 0; i < size; i++) {
                uint64_t output;
                myread(&output, sizeof(uint64_t));
                uint inputSize;
                myread(&inputSize, sizeof(uint));
                Vector<uint64_t> inputs;
                inputs.setSize(inputSize);
-               myread(inputs.expose(), sizeof(uint64_t)*inputSize);
+               myread(inputs.expose(), sizeof(uint64_t) * inputSize);
                table->addNewTableEntry(inputs.expose(), inputSize, output);
        }
-       
+
        map.put(t_ptr, table);
 }
 
 
-void Deserializer::deserializeElementSet(){
-       ElementSetes_ptr;
-       myread(&es_ptr, sizeof(ElementSet*));
-       Set * set;
+void Deserializer::deserializeElementSet() {
+       ElementSet *es_ptr;
+       myread(&es_ptr, sizeof(ElementSet *));
+       Set *set;
        myread(&set, sizeof(Set *));
        ASSERT(map.contains(set));
-       set  = (Set*) map.get(set);
+       set  = (Set *) map.get(set);
        map.put(es_ptr, solver->getElementVar(set));
 }
 
-void Deserializer::deserializeElementConst(){
-       ElementSetes_ptr;
-       myread(&es_ptr, sizeof(ElementSet*));
+void Deserializer::deserializeElementConst() {
+       ElementSet *es_ptr;
+       myread(&es_ptr, sizeof(ElementSet *));
        VarType type;
        myread(&type, sizeof(VarType));
        uint64_t value;
@@ -321,70 +320,70 @@ void Deserializer::deserializeElementConst(){
        map.put(es_ptr, solver->getElementConst(type, value));
 }
 
-void Deserializer::deserializeElementFunction(){
+void Deserializer::deserializeElementFunction() {
        ElementFunction *ef_ptr;
        myread(&ef_ptr, sizeof(ElementFunction *));
        Function *function;
-       myread(&function, sizeof(Function*));
+       myread(&function, sizeof(Function *));
        ASSERT(map.contains(function));
-       function = (Function*) map.get(function);
+       function = (Function *) map.get(function);
        uint size;
        myread(&size, sizeof(uint));
-       Vector<Element*> members;
-       for(uint i=0; i<size; i++){
-               Elementinput;
+       Vector<Element *> members;
+       for (uint i = 0; i < size; i++) {
+               Element *input;
                myread(&input, sizeof(Element *));
                ASSERT(map.contains(input));
-               input = (Element*) map.get(input);
+               input = (Element *) map.get(input);
                members.push(input);
        }
-       
-       Booleanoverflowstatus;
+
+       Boolean *overflowstatus;
        myread(&overflowstatus, sizeof(Boolean *));
        BooleanEdge tmp(overflowstatus);
        bool isNegated = tmp.isNegated();
        ASSERT(map.contains(tmp.getBoolean()));
-       overflowstatus = (Boolean*) map.get(tmp.getBoolean());
+       overflowstatus = (Boolean *) map.get(tmp.getBoolean());
        BooleanEdge res(overflowstatus);
-       BooleanEdge undefStatus = isNegated?res.negate():res;
-       
+       BooleanEdge undefStatus = isNegated ? res.negate() : res;
+
        map.put(ef_ptr, solver->applyFunction(function, members.expose(), size, undefStatus));
 }
 
 
-void Deserializer::deserializeFunctionOperator(){
+void Deserializer::deserializeFunctionOperator() {
        FunctionOperator *fo_ptr;
        myread(&fo_ptr, sizeof(FunctionOperator *));
        ArithOp op;
        myread(&op, sizeof(ArithOp));
        uint size;
        myread(&size, sizeof(uint));
-       Vector<Set*> domains;
-       for(uint i=0; i<size; i++){
-               Setdomain;
-               myread(&domain, sizeof(Set*));
+       Vector<Set *> domains;
+       for (uint i = 0; i < size; i++) {
+               Set *domain;
+               myread(&domain, sizeof(Set *));
                ASSERT(map.contains(domain));
-               domain = (Set*) map.get(domain);
+               domain = (Set *) map.get(domain);
                domains.push(domain);
        }
-       Setrange;
-       myread(&range, sizeof(Set*));
+       Set *range;
+       myread(&range, sizeof(Set *));
        ASSERT(map.contains(range));
-       range = (Set*) map.get(range);
+       range = (Set *) map.get(range);
        OverFlowBehavior overflowbehavior;
        myread(&overflowbehavior, sizeof(OverFlowBehavior));
        map.put(fo_ptr, solver->createFunctionOperator(op, domains.expose(), size, range, overflowbehavior));
 }
 
-void Deserializer::deserializeFunctionTable(){
+void Deserializer::deserializeFunctionTable() {
        FunctionTable *ft_ptr;
        myread(&ft_ptr, sizeof(FunctionTable *));
-       Tabletable;
-       myread(&table, sizeof(Table*));
+       Table *table;
+       myread(&table, sizeof(Table *));
        ASSERT(map.contains(table));
-       table = (Table*) map.get(table);
+       table = (Table *) map.get(table);
        UndefinedBehavior undefinedbehavior;
        myread(&undefinedbehavior, sizeof(UndefinedBehavior));
-       
+
        map.put(ft_ptr, solver->completeTable(table, undefinedbehavior));
-}
\ No newline at end of file
+}
index 057346d4cbca9652d34118f708e52c24d227cf79..6335c897c42270ba115a8dc87b5f57f67e4e1b8a 100644 (file)
@@ -1,5 +1,5 @@
 
-/* 
+/*
  * File:   deserializer.h
  * Author: hamed
  *
 /**
  * Style of serialized file:
  * ASTNodeType#Pointer#ObjectDATA
- * 
+ *
  * @param file
  */
 class Deserializer {
 public:
-       Deserializer(const charfile);
+       Deserializer(const char *file);
        CSolver *deserialize();
        virtual ~Deserializer();
 private:
@@ -44,5 +44,5 @@ private:
        CloneMap map;
 };
 
-#endif /* DESERIALIZER_H */
+#endif/* DESERIALIZER_H */
 
index b49b98b45e828e101392a1b9c789f0c488fa13c9..810ece81237929aed77dba5d43c2764d42f7f8c8 100644 (file)
@@ -1,8 +1,8 @@
 
-/* 
+/*
  * File:   serializer.cc
  * Author: hamed
- * 
+ *
  * Created on September 7, 2017, 3:38 PM
  */
 
 
 Serializer::Serializer(const char *file) {
        filedesc = open(file, O_WRONLY | O_CREAT | O_TRUNC, 0666);
+
        if (filedesc < 0) {
                exit(-1);
        }
 }
 
 Serializer::~Serializer() {
-       if (-1 == close(filedesc)){
+       if (-1 == close(filedesc)) {
                exit(-1);
        }
 }
 
-void Serializer::mywrite(const void *__buf, size_t __n){
+void Serializer::mywrite(const void *__buf, size_t __n) {
        write (filedesc, __buf, __n);
 }
 
 
-void serializeBooleanEdge(Serializer* serializer, BooleanEdge be){
-       if(be == BooleanEdge(NULL))
+void serializeBooleanEdge(Serializer *serializer, BooleanEdge be) {
+       if (be == BooleanEdge(NULL))
                return;
        be.getBoolean()->serialize(serializer);
        ASTNodeType type = BOOLEANEDGE;
        serializer->mywrite(&type, sizeof(ASTNodeType));
-       Booleanboolean = be.getRaw();
-       serializer->mywrite(&boolean, sizeof(Boolean*));
+       Boolean *boolean = be.getRaw();
+       serializer->mywrite(&boolean, sizeof(Boolean *));
 }
\ No newline at end of file
index e6d2b50bce8707d23ae4a379c411ff936926a957..f147773f5ebf9fae2533ebd38da5d4130d0ab9c3 100644 (file)
@@ -1,5 +1,5 @@
 
-/* 
+/*
  * File:   serializer.h
  * Author: hamed
  *
@@ -26,14 +26,14 @@ private:
        CloneMap map;
 };
 
-inline bool Serializer::isSerialized(void* obj){
+inline bool Serializer::isSerialized(void *obj) {
        return map.contains(obj);
 }
 
 
 
 
-void serializeBooleanEdge(Serializerserializer, BooleanEdge be);
+void serializeBooleanEdge(Serializer *serializer, BooleanEdge be);
 
-#endif /* SERIALIZER_H */
+#endif/* SERIALIZER_H */
 
index 52707c5da14f837c631f792b9182a05a09f7d3f4..7bbe9db740916c99d80d8607a8a27f5d4a1af1e6 100644 (file)
@@ -13,8 +13,8 @@
  * 8=>9
  * 9=>2
  * 6=>2
- * 
- * 
+ *
+ *
  */
 int main(int numargs, char **argv) {
        CSolver *solver = new CSolver();
@@ -22,110 +22,108 @@ int main(int numargs, char **argv) {
        Set *s = solver->createSet(0, set1, 10);
        Order *order = solver->createOrder(SATC_TOTAL, s);
        BooleanEdge b01 =  solver->orderConstraint(order, 0, 1);
-        solver->addConstraint(b01);
+       solver->addConstraint(b01);
        BooleanEdge b12 =  solver->orderConstraint(order, 1, 2);
-        solver->addConstraint(b12);
+       solver->addConstraint(b12);
        BooleanEdge b23 =  solver->orderConstraint(order, 2, 3);
-        solver->addConstraint(b23);
+       solver->addConstraint(b23);
        BooleanEdge b14 =  solver->orderConstraint(order, 1, 4);
-        solver->addConstraint(b14);
+       solver->addConstraint(b14);
        BooleanEdge b45 =  solver->orderConstraint(order, 4, 5);
-        solver->addConstraint(b45);
+       solver->addConstraint(b45);
        BooleanEdge b56 =  solver->orderConstraint(order, 5, 6);
-        solver->addConstraint(b56);
+       solver->addConstraint(b56);
        BooleanEdge b17 =  solver->orderConstraint(order, 1, 7);
-        solver->addConstraint(b17);
+       solver->addConstraint(b17);
        BooleanEdge b78 =  solver->orderConstraint(order, 7, 8);
-        solver->addConstraint(b78);
+       solver->addConstraint(b78);
        BooleanEdge b89 =  solver->orderConstraint(order, 8, 9);
-        solver->addConstraint(b89);
+       solver->addConstraint(b89);
        BooleanEdge b92 =  solver->orderConstraint(order, 9, 2);
-        solver->addConstraint(b92);
+       solver->addConstraint(b92);
        BooleanEdge b62 =  solver->orderConstraint(order, 6, 2);
-        solver->addConstraint(b62);
+       solver->addConstraint(b62);
 
-        BooleanEdge v1 = solver->getBooleanVar(0);
-        solver->addConstraint(solver->applyLogicalOperation(SATC_NOT, v1));
-        BooleanEdge v2 = solver->getBooleanVar(0);
-        solver->addConstraint(solver->applyLogicalOperation(SATC_NOT, v2));
-        BooleanEdge v3 = solver->getBooleanVar(0);
-        BooleanEdge v4 = solver->getBooleanVar(0);
-        BooleanEdge v5 = solver->getBooleanVar(0);
-        solver->addConstraint(
-                solver->applyLogicalOperation(SATC_OR, 
-                solver->applyLogicalOperation(SATC_IFF, v3, v4),
-                v5));
-        solver->addConstraint(solver->applyLogicalOperation(SATC_NOT, v5));
-        BooleanEdge v6 = solver->getBooleanVar(0);
-        BooleanEdge v7 = solver->getBooleanVar(0);
-        BooleanEdge v8 = solver->getBooleanVar(0);
-        solver->addConstraint(
-                solver->applyLogicalOperation(SATC_OR, 
-                solver->applyLogicalOperation(SATC_IFF, v7, v8),
-                v6));
+       BooleanEdge v1 = solver->getBooleanVar(0);
+       solver->addConstraint(solver->applyLogicalOperation(SATC_NOT, v1));
+       BooleanEdge v2 = solver->getBooleanVar(0);
+       solver->addConstraint(solver->applyLogicalOperation(SATC_NOT, v2));
+       BooleanEdge v3 = solver->getBooleanVar(0);
+       BooleanEdge v4 = solver->getBooleanVar(0);
+       BooleanEdge v5 = solver->getBooleanVar(0);
+       BooleanEdge be = solver->applyLogicalOperation(SATC_IFF, v3, v4);
+       BooleanEdge sor = solver->applyLogicalOperation(SATC_OR, be, v5);
+       solver->addConstraint(sor);
+       solver->addConstraint(solver->applyLogicalOperation(SATC_NOT, v5));
+       BooleanEdge v6 = solver->getBooleanVar(0);
+       BooleanEdge v7 = solver->getBooleanVar(0);
+       BooleanEdge v8 = solver->getBooleanVar(0);
+       solver->addConstraint(
+               solver->applyLogicalOperation(SATC_OR,
+                                                                                                                                       solver->applyLogicalOperation(SATC_IFF, v7, v8),
+                                                                                                                                       v6));
        solver->addConstraint(solver->applyLogicalOperation(SATC_NOT, v6));
-        BooleanEdge v9 = solver->getBooleanVar(0);
+       BooleanEdge v9 = solver->getBooleanVar(0);
        solver->addConstraint(solver->applyLogicalOperation(SATC_IMPLIES, v9, v3));
-        BooleanEdge v10 = solver->getBooleanVar(0);
-        BooleanEdge v11 = solver->getBooleanVar(0);
-        BooleanEdge v12 = solver->getBooleanVar(0);
-        solver->addConstraint(
-                solver->applyLogicalOperation(SATC_OR, 
-                solver->applyLogicalOperation(SATC_OR, v10, v11),
-                solver->applyLogicalOperation(SATC_IFF, v1, v12)));
-        BooleanEdge b48 =  solver->orderConstraint(order, 4, 8);
-        solver->addConstraint(
-                solver->applyLogicalOperation(SATC_OR, 
-                solver->applyLogicalOperation(SATC_OR, v10, v11),
-                b48));
-        BooleanEdge v13 = solver->getBooleanVar(0);
-        BooleanEdge v14 = solver->getBooleanVar(0);
-        solver->addConstraint(
-                solver->applyLogicalOperation(SATC_OR, 
-                solver->applyLogicalOperation(SATC_IMPLIES, v10, v11),
-                solver->applyLogicalOperation(SATC_AND,
-                        solver->applyLogicalOperation(SATC_IFF, v12, v13),
-                        solver->applyLogicalOperation(SATC_NOT,b48))
-        ));
-        solver->addConstraint(solver->applyLogicalOperation(SATC_NOT, v11));
-        solver->addConstraint(v14);
-        solver->addConstraint(solver->applyLogicalOperation(SATC_IMPLIES, v8, v12));
-        solver->addConstraint(solver->applyLogicalOperation(SATC_IMPLIES, v12, v8));
-        BooleanEdge v15 = solver->getBooleanVar(0);
-        BooleanEdge v16 = solver->getBooleanVar(0);
-        BooleanEdge v17 = solver->getBooleanVar(0);
-        BooleanEdge v18 = solver->getBooleanVar(0);
-        solver->addConstraint(
-                solver->applyLogicalOperation(SATC_OR, 
-                solver->applyLogicalOperation(SATC_OR, v15, v16),
-                solver->applyLogicalOperation(SATC_IFF, v17, v2)
-        ));
-        BooleanEdge b57 =  solver->orderConstraint(order, 5, 7);
-        solver->addConstraint(
-                solver->applyLogicalOperation(SATC_IMPLIES, 
-                b57,
-                solver->applyLogicalOperation(SATC_OR, v15, v16)
-        ));
-        solver->addConstraint(
-                solver->applyLogicalOperation(SATC_IMPLIES, 
-                solver->applyLogicalOperation(SATC_AND, v15, solver->applyLogicalOperation(SATC_NOT,v16)),
-                solver->applyLogicalOperation(SATC_AND, b57, solver->applyLogicalOperation(SATC_IFF, v17, v14))
-        ));
-        solver->addConstraint(solver->applyLogicalOperation(SATC_NOT, v16));
-        solver->addConstraint(solver->applyLogicalOperation(SATC_IMPLIES, v13, v17));
-        solver->addConstraint(solver->applyLogicalOperation(SATC_IMPLIES, v17, v13));
-        solver->addConstraint(solver->applyLogicalOperation(SATC_IMPLIES, v4, v17));
-        solver->addConstraint(solver->applyLogicalOperation(SATC_IMPLIES, v17, v4));
-        solver->addConstraint(solver->applyLogicalOperation(SATC_IMPLIES, v18, v9));
-        solver->addConstraint(v18);
-        
-        if (solver->solve() == 1){
+       BooleanEdge v10 = solver->getBooleanVar(0);
+       BooleanEdge v11 = solver->getBooleanVar(0);
+       BooleanEdge v12 = solver->getBooleanVar(0);
+       solver->addConstraint(
+               solver->applyLogicalOperation(SATC_OR,
+                                                                                                                                       solver->applyLogicalOperation(SATC_OR, v10, v11),
+                                                                                                                                       solver->applyLogicalOperation(SATC_IFF, v1, v12)));
+       BooleanEdge b48 =  solver->orderConstraint(order, 4, 8);
+       BooleanEdge be1 = solver->applyLogicalOperation(SATC_OR, v10, v11);
+       BooleanEdge be2 = solver->applyLogicalOperation(SATC_OR, be1, b48);
+       solver->addConstraint(be2);
+       BooleanEdge v13 = solver->getBooleanVar(0);
+       BooleanEdge v14 = solver->getBooleanVar(0);
+       solver->addConstraint(
+               solver->applyLogicalOperation(SATC_OR,
+                                                                                                                                       solver->applyLogicalOperation(SATC_IMPLIES, v10, v11),
+                                                                                                                                       solver->applyLogicalOperation(SATC_AND,
+                                                                                                                                                                                                                                                               solver->applyLogicalOperation(SATC_IFF, v12, v13),
+                                                                                                                                                                                                                                                               solver->applyLogicalOperation(SATC_NOT,b48))
+                                                                                                                                       ));
+       solver->addConstraint(solver->applyLogicalOperation(SATC_NOT, v11));
+       solver->addConstraint(v14);
+       solver->addConstraint(solver->applyLogicalOperation(SATC_IMPLIES, v8, v12));
+       solver->addConstraint(solver->applyLogicalOperation(SATC_IMPLIES, v12, v8));
+       BooleanEdge v15 = solver->getBooleanVar(0);
+       BooleanEdge v16 = solver->getBooleanVar(0);
+       BooleanEdge v17 = solver->getBooleanVar(0);
+       BooleanEdge v18 = solver->getBooleanVar(0);
+       solver->addConstraint(
+               solver->applyLogicalOperation(SATC_OR,
+                                                                                                                                       solver->applyLogicalOperation(SATC_OR, v15, v16),
+                                                                                                                                       solver->applyLogicalOperation(SATC_IFF, v17, v2)
+                                                                                                                                       ));
+       BooleanEdge b57 =  solver->orderConstraint(order, 5, 7);
+       solver->addConstraint(
+               solver->applyLogicalOperation(SATC_IMPLIES,
+                                                                                                                                       b57,
+                                                                                                                                       solver->applyLogicalOperation(SATC_OR, v15, v16)
+                                                                                                                                       ));
+       solver->addConstraint(
+               solver->applyLogicalOperation(SATC_IMPLIES,
+                                                                                                                                       solver->applyLogicalOperation(SATC_AND, v15, solver->applyLogicalOperation(SATC_NOT,v16)),
+                                                                                                                                       solver->applyLogicalOperation(SATC_AND, b57, solver->applyLogicalOperation(SATC_IFF, v17, v14))
+                                                                                                                                       ));
+       solver->addConstraint(solver->applyLogicalOperation(SATC_NOT, v16));
+       solver->addConstraint(solver->applyLogicalOperation(SATC_IMPLIES, v13, v17));
+       solver->addConstraint(solver->applyLogicalOperation(SATC_IMPLIES, v17, v13));
+       solver->addConstraint(solver->applyLogicalOperation(SATC_IMPLIES, v4, v17));
+       solver->addConstraint(solver->applyLogicalOperation(SATC_IMPLIES, v17, v4));
+       solver->addConstraint(solver->applyLogicalOperation(SATC_IMPLIES, v18, v9));
+       solver->addConstraint(v18);
+
+       if (solver->solve() == 1) {
                printf("SAT\n");
-               printf("O(5,1)=%d O(1,4)=%d O(5,4)=%d O(1,5)=%d\n", 
-                       solver->getOrderConstraintValue(order, 5, 1), 
-                       solver->getOrderConstraintValue(order, 1, 4),
-                       solver->getOrderConstraintValue(order, 5, 4),
-                       solver->getOrderConstraintValue(order, 1, 5));
+               printf("O(5,1)=%d O(1,4)=%d O(5,4)=%d O(1,5)=%d\n",
+                                        solver->getOrderConstraintValue(order, 5, 1),
+                                        solver->getOrderConstraintValue(order, 1, 4),
+                                        solver->getOrderConstraintValue(order, 5, 4),
+                                        solver->getOrderConstraintValue(order, 1, 5));
        } else {
                printf("UNSAT\n");
        }
index 8780b2769d470ca8bc1d120102aec5ad9ab16cfa..1d1124c7bcd986303734b0a2570a78b424ea34ab 100644 (file)
@@ -13,8 +13,8 @@
  * 8=>9
  * 9=>2
  * 6=>2
- * 
- * 
+ *
+ *
  */
 int main(int numargs, char **argv) {
        CSolver *solver = new CSolver();
@@ -53,11 +53,11 @@ int main(int numargs, char **argv) {
        BooleanEdge b57 =  solver->orderConstraint(order, 5, 7);
        solver->addConstraint(b57);
 
-       
-       if (solver->solve() == 1){
+
+       if (solver->solve() == 1) {
                printf("SAT\n");
-               printf("O(5,1)=%d O(1,4)=%d O(5,4)=%d O(1,5)=%d\n", 
-                                        solver->getOrderConstraintValue(order, 5, 1), 
+               printf("O(5,1)=%d O(1,4)=%d O(5,4)=%d O(1,5)=%d\n",
+                                        solver->getOrderConstraintValue(order, 5, 1),
                                         solver->getOrderConstraintValue(order, 1, 4),
                                         solver->getOrderConstraintValue(order, 5, 4),
                                         solver->getOrderConstraintValue(order, 1, 5));
diff --git a/src/Test/constraint.cc b/src/Test/constraint.cc
new file mode 100644 (file)
index 0000000..b270524
--- /dev/null
@@ -0,0 +1,21 @@
+#include "csolver.h"
+
+int main(int numargs, char **argv) {
+       CSolver *solver = new CSolver();
+       uint64_t elements[] = {0, 1};
+       Set *s = solver->createSet(1, elements, 2);
+       Element *e1 = solver->getElementVar(s);
+       Element *e2 = solver->getElementVar(s);
+       Set *sarray[] = {s, s};
+       Predicate *p = solver->createPredicateOperator(SATC_LT, sarray, 2);
+       Element *earray[] = {e1, e2};
+       BooleanEdge be = solver->applyPredicate(p, earray, 2);
+       solver->addConstraint(be);
+
+       if (solver->solve() == 1) {
+               printf("SAT\n");
+       } else {
+               printf("UNSAT\n");
+       }
+       delete solver;
+}
diff --git a/src/Test/graphtest.cc b/src/Test/graphtest.cc
new file mode 100644 (file)
index 0000000..976ce60
--- /dev/null
@@ -0,0 +1,19 @@
+#include "csolver.h"
+
+int main(int numargs, char **argv) {
+       CSolver *solver = new CSolver();
+       uint64_t set1[] = {1, 2, 3};
+       Set *s = solver->createSet(0, set1, 3);
+       Order *order = solver->createOrder(SATC_TOTAL, s);
+       BooleanEdge b12 =  solver->orderConstraint(order, 1, 2);
+       solver->addConstraint(b12);
+       BooleanEdge b23 =  solver->orderConstraint(order, 2, 3);
+       solver->addConstraint(b23);
+
+       if (solver->solve() == 1) {
+               printf("SAT\n");
+       } else {
+               printf("UNSAT\n");
+       }
+       delete solver;
+}
index e2c46e0593c1df06d2144243eb52fbdc105ae622..148235adf1f67dc971ab255f626a6a4782ae3aad 100644 (file)
@@ -17,13 +17,13 @@ int main(int numargs, char **argv) {
        solver->addConstraint(solver->applyLogicalOperation(SATC_OR, b1, solver->applyLogicalOperation(SATC_NOT, b2)));
        solver->addConstraint(solver->applyLogicalOperation(SATC_OR, b2, solver->applyLogicalOperation(SATC_NOT, b1)));
        solver->serialize();
-       if (solver->solve() == 1){
+       if (solver->solve() == 1) {
                printf("SAT\n");
-               printf("O(5,1)=%d O(1,4)=%d O(5,4)=%d O(1,5)=%d\n", 
-                       solver->getOrderConstraintValue(order, 5, 1), 
-                       solver->getOrderConstraintValue(order, 1, 4),
-                       solver->getOrderConstraintValue(order, 5, 4),
-                       solver->getOrderConstraintValue(order, 1, 5));
+               printf("O(5,1)=%d O(1,4)=%d O(5,4)=%d O(1,5)=%d\n",
+                                        solver->getOrderConstraintValue(order, 5, 1),
+                                        solver->getOrderConstraintValue(order, 1, 4),
+                                        solver->getOrderConstraintValue(order, 5, 4),
+                                        solver->getOrderConstraintValue(order, 1, 5));
        } else {
                printf("UNSAT\n");
        }
index 8a177faac749a4907d6c16210bb239d86da602cb..a9c062f3169f52181a69ca830ab7cfaf1955a1aa 100644 (file)
 #include "ordernode.h"
 #include "ordergraph.h"
 
-DecomposeOrderResolver::DecomposeOrderResolver(OrderGraph *_graph, Vector<Order *> &_orders) :
-       graph(_graph),
-       orders(_orders.getSize(), _orders.expose())
+DecomposeOrderResolver::DecomposeOrderResolver(Order *_order) :
+       graph(NULL),
+       order(_order)
 {
 }
 
 DecomposeOrderResolver::~DecomposeOrderResolver() {
+       if (graph != NULL)
+               delete graph;
+       edges.resetAndDelete();
+}
+
+void DecomposeOrderResolver::mustOrderEdge(uint64_t first, uint64_t second) {
+       DOREdge edge(first, second, 0, first, second);
+       if (!edges.contains(&edge)) {
+               DOREdge *newedge = new DOREdge(first, second, 0, first, second);
+               edges.add(newedge);
+       }
+}
+
+void DecomposeOrderResolver::remapEdge(uint64_t first, uint64_t second, uint64_t newfirst, uint64_t newsecond) {
+       DOREdge edge(first, second, 0, first, second);
+       DOREdge *oldedge = edges.get(&edge);
+       if (oldedge != NULL) {
+               edges.remove(oldedge);
+               oldedge->newfirst = newfirst;
+               oldedge->newsecond = newsecond;
+               edges.add(oldedge);
+       } else {
+               DOREdge *newedge = new DOREdge(first, second, 0, newfirst, newsecond);
+               edges.add(newedge);
+       }
+}
+
+void DecomposeOrderResolver::setEdgeOrder(uint64_t first, uint64_t second, uint sccNum) {
+       DOREdge edge(first, second, 0, first, second);
+       DOREdge *oldedge = edges.get(&edge);
+       if (oldedge != NULL) {
+               oldedge->orderindex = sccNum;
+       } else {
+               DOREdge *newedge = new DOREdge(first, second, sccNum, first, second);
+               edges.add(newedge);
+       }
+}
+
+void DecomposeOrderResolver::setOrder(uint sccNum, Order *neworder) {
+       orders.setExpand(sccNum, neworder);
+}
+
+Order *DecomposeOrderResolver::getOrder(uint sccNum) {
+       Order *neworder = NULL;
+       if (orders.getSize() > sccNum)
+               neworder = orders.get(sccNum);
+       return neworder;
+}
+
+void DecomposeOrderResolver::buildGraph() {
+       graph = new OrderGraph(order);
+       SetIteratorDOREdge *iterator = edges.iterator();
+       while (iterator->hasNext()) {
+               DOREdge *doredge = iterator->next();
+               if (doredge->orderindex == 0) {
+                       graph->addEdge(doredge->origfirst, doredge->origsecond);
+               } else {
+                       Order *suborder = orders.get(doredge->orderindex);
+                       bool isEdge = suborder->encoding.resolver->resolveOrder(doredge->newfirst, doredge->newsecond);
+                       if (isEdge)
+                               graph->addEdge(doredge->origfirst, doredge->origsecond);
+                       else if (order->type == SATC_TOTAL)
+                               graph->addEdge(doredge->origsecond, doredge->origfirst);
+               }
+       }
+       delete iterator;
+       if (order->type == SATC_TOTAL) {
+               graph->computeStronglyConnectedComponentGraph();
+       }
 }
 
 bool DecomposeOrderResolver::resolveOrder(uint64_t first, uint64_t second) {
+       if (graph == NULL)
+               buildGraph();
+
        OrderNode *from = graph->lookupOrderNodeFromOrderGraph(first);
-       ASSERT(from != NULL);
+       if (from == NULL) {
+               ASSERT(order->type != SATC_TOTAL);
+               return false;
+       }
        OrderNode *to = graph->lookupOrderNodeFromOrderGraph(second);
-       ASSERT(to != NULL);
-
-       if (from->sccNum != to->sccNum) {
-               OrderEdge *edge = graph->lookupOrderEdgeFromOrderGraph(from, to);
-               if (edge != NULL && edge->mustPos) {
-                       return true;
-               } else if ( edge != NULL && edge->mustNeg) {
-                       return false;
-               } else {
-                       switch (graph->getOrder()->type) {
-                       case SATC_TOTAL:
-                               return from->sccNum < to->sccNum;
-                       case SATC_PARTIAL:
-                               return resolvePartialOrder(from, to);
-                       default:
-                               ASSERT(0);
-                       }
-               }
-       } else {
-               Order *suborder = NULL;
-               // We should ask this query from the suborder ....
-               suborder = orders.get(from->sccNum);
-               ASSERT(suborder != NULL);
-               return suborder->encoding.resolver->resolveOrder(from->id, to->id);
+       if (to == NULL) {
+               ASSERT(order->type != SATC_TOTAL);
+               return false;
+       }
+       switch (order->type) {
+       case SATC_TOTAL:
+               return from->sccNum < to->sccNum;
+       case SATC_PARTIAL:
+               return resolvePartialOrder(from, to);
+       default:
+               ASSERT(0);
        }
 }
 
-bool DecomposeOrderResolver::resolvePartialOrder(OrderNode* first, OrderNode* second){
-       if(first->sccNum > second->sccNum){
+bool DecomposeOrderResolver::resolvePartialOrder(OrderNode *first, OrderNode *second) {
+       if (first->sccNum > second->sccNum) {
                return false;
        } else {
                return graph->isTherePath(first, second);
        }
-               
 }
 
index f1d06c6914924f4f3d708de0f24a0c52828dabd1..a2603096d036efbc2aaf38ae110c0d3cbacc6dcf 100644 (file)
 #include "structs.h"
 #include "orderresolver.h"
 
+class DOREdge {
+public:
+       DOREdge(uint64_t _origfirst, uint64_t _origsecond, uint _orderindex, uint64_t _newfirst, uint64_t _newsecond) :
+               origfirst(_origfirst),
+               origsecond(_origsecond),
+               orderindex(_orderindex),
+               newfirst(_newfirst),
+               newsecond(_newsecond) {
+       }
+       uint64_t origfirst;
+       uint64_t origsecond;
+       uint orderindex;
+       uint64_t newfirst;
+       uint64_t newsecond;
+       CMEMALLOC;
+};
+
 class DecomposeOrderResolver : public OrderResolver {
 public:
-       DecomposeOrderResolver(OrderGraph *graph, Vector<Order *> &orders);
-       bool resolveOrder(uint64_t first, uint64_t second);
-       bool resolvePartialOrder(OrderNode* first, OrderNode* second);
+       DecomposeOrderResolver(Order *_order);
+       virtual bool resolveOrder(uint64_t first, uint64_t second);
        virtual ~DecomposeOrderResolver();
+       void mustOrderEdge(uint64_t first, uint64_t second);
+       void remapEdge(uint64_t oldfirst, uint64_t oldsecond, uint64_t newfirst, uint64_t newsecond);
+       void setEdgeOrder(uint64_t first, uint64_t second, uint sccNum);
+       void setOrder(uint sccNum, Order *order);
+       Order *getOrder(uint sccNum);
+       CMEMALLOC;
+
 private:
+       bool resolvePartialOrder(OrderNode *first, OrderNode *second);
+       void buildGraph();
        OrderGraph *graph;
+       Order *order;
        Vector<Order *> orders;
+       HashsetDOREdge edges;
 };
 
 #endif/* DECOMPOSEORDERRESOLVER_H */
index e32a757ffb57a1838a6c3b3f77f9a6c25907d4ba..38c8a761824b0139fc0d3bcdda376486bc2f47a9 100644 (file)
@@ -23,7 +23,7 @@ OrderPairResolver::OrderPairResolver(CSolver *_solver, Order *_order) :
 
 OrderPairResolver::~OrderPairResolver() {
        if (orderPairTable != NULL) {
-               orderPairTable->resetanddelete();
+               orderPairTable->resetAndDeleteVals();
                delete orderPairTable;
        }
 }
@@ -38,7 +38,7 @@ bool OrderPairResolver::resolveOrder(uint64_t first, uint64_t second) {
                ASSERT(to != NULL);
 
                OrderEdge *edge = graph->lookupOrderEdgeFromOrderGraph(from, to);
-               
+
                if (edge != NULL && edge->mustPos) {
                        return true;
                } else if ( edge != NULL && edge->mustNeg) {
index dde73784c42d757cd7b2ce73de56acf40e0484a6..79212ae70b3464c8d1e40c937d34d1a3826280d3 100644 (file)
@@ -15,13 +15,13 @@ class OrderPairResolver : public OrderResolver {
 public:
        OrderPairResolver(CSolver *_solver, Order *_order);
        bool resolveOrder(uint64_t first, uint64_t second);
-       HashtableOrderPairgetOrderPairTable() { return orderPairTable;}
+       HashtableOrderPair *getOrderPairTable() { return orderPairTable;}
        virtual ~OrderPairResolver();
 private:
        CSolver *solver;
        Order *order;
        HashtableOrderPair *orderPairTable;
-       
+
        bool getOrderConstraintValue(uint64_t first, uint64_t second);
 };
 
index 3e9586096e36a1d0121db35b760556c49b6597f2..c1195977f2ab618fea8e6d0b7267468f38d82079 100644 (file)
@@ -54,9 +54,9 @@ unsigned int tunableSettingHash(TunableSetting *setting) {
 
 bool tunableSettingEquals(TunableSetting *setting1, TunableSetting *setting2) {
        return setting1->hasVar == setting2->hasVar &&
-               setting1->type1 == setting2->type1 &&
-               setting1->type2 == setting2->type2 &&
-               setting1->param == setting2->param;
+                                setting1->type1 == setting2->type1 &&
+                                setting1->type2 == setting2->type2 &&
+                                setting1->param == setting2->param;
 }
 
 SearchTuner::SearchTuner() {
@@ -110,7 +110,7 @@ int SearchTuner::getVarTunable(VarType vartype1, VarType vartype2, TunableParam
                result = settings.get(&setting);
                if ( result == NULL) {
                        result = new
-                               TunableSetting(vartype1, vartype2, param);
+                                                        TunableSetting(vartype1, vartype2, param);
                        uint value = descriptor->lowValue + (random() % (1 + descriptor->highValue - descriptor->lowValue));
                        result->setDecision(descriptor->lowValue, descriptor->highValue, descriptor->defaultValue, value);
                        settings.add(result);
index 69c710ef3f927232ac5275f5ffaede8a07d151be..bb102ad8c4c6eaca9b07a65571836fb4c828b950 100644 (file)
@@ -53,6 +53,7 @@ class OrderEncoding;
 class OrderGraph;
 class OrderNode;
 class OrderEdge;
+class DOREdge;
 
 class AutoTuner;
 class SearchTuner;
index fac5a0bef27eaded2e5993406bf8c7a30d7c51ee..0efebf8152d581e20066ca2e32222b5be37e9717 100644 (file)
@@ -18,6 +18,7 @@
 #include "config.h"
 #include "time.h"
 
+
 #if 1
 extern int model_out;
 extern int model_err;
@@ -32,6 +33,8 @@ extern int switch_alloc;
 #endif
 #define model_println(fmt, ...) do { model_print(fmt, ## __VA_ARGS__); model_print("\n");} while(0)
 
+
+
 #define NEXTPOW2(x) ((x == 1) ? 1 : (1 << (sizeof(uint) * 8 - __builtin_clz(x - 1))))
 #define NUMBITS(x) ((x == 0) ? 0 : 8 * sizeof(x) - __builtin_clz(x))
 
index d2e44b4fcd6030b981cc65209030bba8e9c92af1..81329914c80acea519b310c0bad122328876aff8 100644 (file)
@@ -106,7 +106,6 @@ void CSolver::serialize() {
 //             Deserializer deserializer("dump");
 //             deserializer.deserialize();
 //     }
-       
 }
 
 Set *CSolver::createSet(VarType type, uint64_t *elements, uint numelements) {
@@ -121,7 +120,7 @@ Set *CSolver::createRangeSet(VarType type, uint64_t lowrange, uint64_t highrange
        return set;
 }
 
-VarType CSolver::getSetVarType(Set *set){
+VarType CSolver::getSetVarType(Set *set) {
        return set->getType();
 }
 
@@ -146,7 +145,7 @@ uint64_t CSolver::createUniqueItem(MutableSet *set) {
        return element;
 }
 
-void CSolver::finalizeMutableSet(MutableSet* set){
+void CSolver::finalizeMutableSet(MutableSet *set) {
        set->finalize();
 }
 
@@ -157,7 +156,7 @@ Element *CSolver::getElementVar(Set *set) {
        return element;
 }
 
-Set* CSolver::getElementRange (Element* element){
+Set *CSolver::getElementRange (Element *element) {
        return element->getRange();
 }
 
@@ -266,11 +265,11 @@ BooleanEdge CSolver::applyPredicateTable(Predicate *predicate, Element **inputs,
 }
 
 bool CSolver::isTrue(BooleanEdge b) {
-        return b.isNegated()?b->isFalse():b->isTrue();
+       return b.isNegated() ? b->isFalse() : b->isTrue();
 }
 
 bool CSolver::isFalse(BooleanEdge b) {
-        return b.isNegated()?b->isTrue():b->isFalse();
+       return b.isNegated() ? b->isTrue() : b->isFalse();
 }
 
 BooleanEdge CSolver::applyLogicalOperation(LogicOp op, BooleanEdge arg1, BooleanEdge arg2) {
@@ -285,7 +284,7 @@ BooleanEdge CSolver::applyLogicalOperation(LogicOp op, BooleanEdge arg) {
 
 static int ptrcompares(const void *p1, const void *p2) {
        uintptr_t b1 = *(uintptr_t const *) p1;
-  uintptr_t b2 = *(uintptr_t const *) p2;
+       uintptr_t b2 = *(uintptr_t const *) p2;
        if (b1 < b2)
                return -1;
        else if (b1 == b2)
@@ -294,12 +293,11 @@ static int ptrcompares(const void *p1, const void *p2) {
                return 1;
 }
 
-BooleanEdge CSolver::rewriteLogicalOperation(LogicOp op, BooleanEdge * array, uint asize) {
-  return applyLogicalOperation(op, array, asize);
-  /*  BooleanEdge newarray[asize];
+BooleanEdge CSolver::rewriteLogicalOperation(LogicOp op, BooleanEdge *array, uint asize) {
+       BooleanEdge newarray[asize];
        memcpy(newarray, array, asize * sizeof(BooleanEdge));
-       for(uint i=0; i < asize; i++) {
-               BooleanEdge b=newarray[i];
+       for (uint i = 0; i < asize; i++) {
+               BooleanEdge b = newarray[i];
                if (b->type == LOGICOP) {
                        if (((BooleanLogic *) b.getBoolean())->replaced) {
                                newarray[i] = doRewrite(newarray[i]);
@@ -307,7 +305,7 @@ BooleanEdge CSolver::rewriteLogicalOperation(LogicOp op, BooleanEdge * array, ui
                        }
                }
        }
-       return applyLogicalOperation(op, newarray, asize);*/
+       return applyLogicalOperation(op, newarray, asize);
 }
 
 BooleanEdge CSolver::applyLogicalOperation(LogicOp op, BooleanEdge *array, uint asize) {
@@ -319,14 +317,14 @@ BooleanEdge CSolver::applyLogicalOperation(LogicOp op, BooleanEdge *array, uint
        case SATC_IFF: {
                for (uint i = 0; i < 2; i++) {
                        if (array[i]->type == BOOLCONST) {
-                               if (isTrue(array[i])) { // It can be undefined
+                               if (isTrue(array[i])) { // It can be undefined
                                        return array[1 - i];
-                               } else if(isFalse(array[i])) {
+                               } else if (isFalse(array[i])) {
                                        newarray[0] = array[1 - i];
                                        return applyLogicalOperation(SATC_NOT, newarray, 1);
                                }
                        } else if (array[i]->type == LOGICOP) {
-                               BooleanLogic *b =(BooleanLogic *)array[i].getBoolean();
+                               BooleanLogic *b = (BooleanLogic *)array[i].getBoolean();
                                if (b->replaced) {
                                        return rewriteLogicalOperation(op, array, asize);
                                }
@@ -335,7 +333,7 @@ BooleanEdge CSolver::applyLogicalOperation(LogicOp op, BooleanEdge *array, uint
                break;
        }
        case SATC_OR: {
-               for (uint i =0; i <asize; i++) {
+               for (uint i = 0; i < asize; i++) {
                        newarray[i] = applyLogicalOperation(SATC_NOT, array[i]);
                }
                return applyLogicalOperation(SATC_NOT, applyLogicalOperation(SATC_AND, newarray, asize));
@@ -344,10 +342,6 @@ BooleanEdge CSolver::applyLogicalOperation(LogicOp op, BooleanEdge *array, uint
                uint newindex = 0;
                for (uint i = 0; i < asize; i++) {
                        BooleanEdge b = array[i];
-//                        model_print("And: Argument %u:", i);
-//                        if(b.isNegated())
-//                                model_print("!");
-//                        b->print();
                        if (b->type == LOGICOP) {
                                if (((BooleanLogic *)b.getBoolean())->replaced)
                                        return rewriteLogicalOperation(op, array, asize);
@@ -355,9 +349,9 @@ BooleanEdge CSolver::applyLogicalOperation(LogicOp op, BooleanEdge *array, uint
                        if (b->type == BOOLCONST) {
                                if (isTrue(b))
                                        continue;
-                               else{
+                               else {
                                        return boolFalse;
-                                }
+                               }
                        } else
                                newarray[newindex++] = b;
                }
@@ -378,39 +372,26 @@ BooleanEdge CSolver::applyLogicalOperation(LogicOp op, BooleanEdge *array, uint
        }
        case SATC_IMPLIES: {
                //handle by translation
-//                model_print("Implies: first:");
-//                if(array[0].isNegated())
-//                        model_print("!");
-//                array[0]->print();
-//                model_print("Implies: second:");
-//                if(array[1].isNegated())
-//                        model_print("!");
-//                array[1]->print();
-//                model_println("##### OK let's get the operation done");
                return applyLogicalOperation(SATC_OR, applyLogicalOperation(SATC_NOT, array[0]), array[1]);
        }
        }
 
        ASSERT(asize != 0);
        Boolean *boolean = new BooleanLogic(this, op, array, asize);
-       /*      Boolean *b = boolMap.get(boolean);
+       Boolean *b = boolMap.get(boolean);
        if (b == NULL) {
                boolean->updateParents();
                boolMap.put(boolean, boolean);
                allBooleans.push(boolean);
                return BooleanEdge(boolean);
        } else {
-       delete boolean;*/
-               return BooleanEdge(boolean);
-               /*      }*/
+               delete boolean;
+               return BooleanEdge(b);
+       }
 }
 
 BooleanEdge CSolver::orderConstraint(Order *order, uint64_t first, uint64_t second) {
-#ifdef TRACE_DEBUG
-        model_println("Creating order: From:%lu => To:%lu", first, second);
-#endif
-        if(first == second)
-                return boolFalse;
+       ASSERT(first != second);
        Boolean *constraint = new BooleanOrder(order, first, second);
        allBooleans.push(constraint);
        return BooleanEdge(constraint);
@@ -422,45 +403,33 @@ void CSolver::addConstraint(BooleanEdge constraint) {
 #endif
        if (isTrue(constraint))
                return;
-       else if (isFalse(constraint)){
-                int t=0;
-#ifdef TRACE_DEBUG
-               model_println("Adding constraint which is false :|");
-#endif
-                setUnSAT();
-        }
+       else if (isFalse(constraint)) {
+               int t = 0;
+               setUnSAT();
+       }
        else {
                if (constraint->type == LOGICOP) {
-                       BooleanLogic *b=(BooleanLogic *) constraint.getBoolean();
+                       BooleanLogic *b = (BooleanLogic *) constraint.getBoolean();
                        if (!constraint.isNegated()) {
-                               if (b->op==SATC_AND) {
-                                       for(uint i=0;i<b->inputs.getSize();i++) {
-#ifdef TRACE_DEBUG
-                                                model_println("In loop");
-#endif
+                               if (b->op == SATC_AND) {
+                                       for (uint i = 0; i < b->inputs.getSize(); i++) {
                                                addConstraint(b->inputs.get(i));
                                        }
                                        return;
                                }
                        }
                        if (b->replaced) {
-#ifdef TRACE_DEBUG
-                                model_println("While rewriting");
-#endif
                                addConstraint(doRewrite(constraint));
                                return;
                        }
                }
                constraints.add(constraint);
-               Boolean *ptr=constraint.getBoolean();
-               
-               if (ptr->boolVal == BV_UNSAT){
-#ifdef TRACE_DEBUG
-                       model_println("BooleanValue is Set to UnSAT");
-#endif
-                        setUnSAT();
-                }
-               
+               Boolean *ptr = constraint.getBoolean();
+
+               if (ptr->boolVal == BV_UNSAT) {
+                       setUnSAT();
+               }
+
                replaceBooleanWithTrueNoRemove(constraint);
                constraint->parents.clear();
        }
@@ -483,24 +452,24 @@ int CSolver::solve() {
        long long startTime = getTimeNano();
        computePolarities(this);
 
-//     Preprocess pp(this);
-//     pp.doTransform();
-       
-//     DecomposeOrderTransform dot(this);
-//     dot.doTransform();
+       Preprocess pp(this);
+       pp.doTransform();
 
-//     IntegerEncodingTransform iet(this);
-//     iet.doTransform();
+       DecomposeOrderTransform dot(this);
+       dot.doTransform();
 
-//     EncodingGraph eg(this);
-//     eg.buildGraph();
-//     eg.encode();
-       
+       IntegerEncodingTransform iet(this);
+       iet.doTransform();
+
+       EncodingGraph eg(this);
+       eg.buildGraph();
+       eg.encode();
+       printConstraints();
        naiveEncodingDecision(this);
        satEncoder->encodeAllSATEncoder(this);
-        model_println("Is problem UNSAT after encoding: %d", unsat);
+       model_print("Is problem UNSAT after encoding: %d\n", unsat);
        int result = unsat ? IS_UNSAT : satEncoder->solve();
-        model_println("Result Computed in CSolver: %d", result);
+       model_print("Result Computed in CSolver: %d\n", result);
        long long finishTime = getTimeNano();
        elapsedTime = finishTime - startTime;
        if (deleteTuner) {
@@ -510,6 +479,19 @@ int CSolver::solve() {
        return result;
 }
 
+void CSolver::printConstraints() {
+       SetIteratorBooleanEdge *it = getConstraints();
+       while (it->hasNext()) {
+               BooleanEdge b = it->next();
+               if (b.isNegated())
+                       model_print("!");
+               b->print();
+               model_print("\n");
+       }
+       delete it;
+
+}
+
 uint64_t CSolver::getElementValue(Element *element) {
        switch (element->type) {
        case ELEMSET:
@@ -523,7 +505,7 @@ uint64_t CSolver::getElementValue(Element *element) {
 }
 
 bool CSolver::getBooleanValue(BooleanEdge bedge) {
-       Boolean *boolean=bedge.getBoolean();
+       Boolean *boolean = bedge.getBoolean();
        switch (boolean->type) {
        case BOOLEANVAR:
                return getBooleanVariableValueSATTranslator(this, boolean);
index b826258d2aea3b0a7634fb89d2831fed4c4e1b73..15d5b453c8b697505ac40e22b4efe7b65cd03996 100644 (file)
@@ -20,7 +20,7 @@ public:
        Set *createRangeSet(VarType type, uint64_t lowrange, uint64_t highrange);
 
        VarType getSetVarType(Set *set);
-       
+
        Element *createRangeVar(VarType type, uint64_t lowrange, uint64_t highrange);
 
        /** This function creates a mutable set. */
@@ -37,11 +37,11 @@ public:
            items to the set. */
 
        uint64_t createUniqueItem(MutableSet *set);
-       
+
        /**
         * Freeze and finalize the mutableSet ...
         */
-       void finalizeMutableSet(MutableSetset);
+       void finalizeMutableSet(MutableSet *set);
 
        /** This function creates an element variable over a set. */
 
@@ -49,8 +49,8 @@ public:
 
        /** This function creates an element constrant. */
        Element *getElementConst(VarType type, uint64_t value);
-       
-       Set* getElementRange (Element* element);
+
+       Set *getElementRange (Element *element);
 
        BooleanEdge getBooleanTrue();
 
@@ -131,16 +131,17 @@ public:
        bool isTrue(BooleanEdge b);
        bool isFalse(BooleanEdge b);
 
-       void setUnSAT() { model_println("Setting UNSAT %%%%%%"); unsat = true; }
-
+       void setUnSAT() { model_print("Setting UNSAT %%%%%%\n"); unsat = true; }
        bool isUnSAT() { return unsat; }
 
+       void printConstraints();
+
        Vector<Order *> *getOrders() { return &allOrders;}
-       HashsetOrder * getActiveOrders() { return &activeOrders;}
+       HashsetOrder *getActiveOrders() { return &activeOrders;}
 
        Tuner *getTuner() { return tuner; }
 
-       SetIteratorBooleanEdge * getConstraints() { return constraints.iterator(); }
+       SetIteratorBooleanEdge *getConstraints() { return constraints.iterator(); }
 
        SATEncoder *getSATEncoder() {return satEncoder;}
 
@@ -189,7 +190,7 @@ private:
        Vector<Order *> allOrders;
 
        HashsetOrder activeOrders;
-       
+
        /** This is a vector of all function structs that we have allocated. */
        Vector<Function *> allFunctions;
 
index e0a60bd13294b871199b826e88c0ea13261c1b3d..9708936e9d829934fd2176053ce37361a8edf6cb 100644 (file)
    void ourfree(void *ptr);
    void * ourcalloc(size_t count, size_t size);
    void * ourrealloc(void *ptr, size_t size);
-*/
+ */
 
-#if 1
-void * model_malloc(size_t size);
+#if 0
+void *model_malloc(size_t size);
 void model_free(void *ptr);
-void * model_calloc(size_t count, size_t size);
-void * model_realloc(void *ptr, size_t size);
+void *model_calloc(size_t count, size_t size);
+void *model_realloc(void *ptr, size_t size);
 
 
 #define ourmalloc model_malloc