Merge branch 'master' of ssh://demsky.eecs.uci.edu/home/git/constraint_compiler into...
authorHamed <hamed.gorjiara@gmail.com>
Sat, 26 Aug 2017 23:58:05 +0000 (16:58 -0700)
committerHamed <hamed.gorjiara@gmail.com>
Sat, 26 Aug 2017 23:58:05 +0000 (16:58 -0700)
61 files changed:
src/AST/astnode.h
src/AST/boolean.cc
src/AST/boolean.h
src/AST/element.cc
src/AST/element.h
src/AST/function.h
src/AST/mutableset.h
src/AST/order.cc
src/AST/order.h
src/AST/predicate.cc
src/AST/predicate.h
src/AST/rewriter.cc
src/AST/rewriter.h
src/AST/set.h
src/AST/table.cc
src/AST/table.h
src/ASTAnalyses/orderedge.cc
src/ASTAnalyses/orderedge.h
src/ASTAnalyses/orderencoder.cc
src/ASTAnalyses/orderencoder.h
src/ASTAnalyses/ordergraph.cc
src/ASTAnalyses/ordergraph.h
src/ASTAnalyses/ordernode.cc
src/ASTAnalyses/ordernode.h
src/ASTAnalyses/polarityassignment.cc
src/ASTTransform/integerencoding.cc
src/ASTTransform/integerencoding.h
src/ASTTransform/orderdecompose.cc
src/ASTTransform/orderdecompose.h
src/Backend/constraint.cc
src/Backend/orderelement.cc
src/Backend/orderelement.h
src/Backend/orderpair.h
src/Backend/satencoder.cc
src/Backend/satfuncopencoder.cc
src/Backend/satfunctableencoder.cc
src/Backend/satorderencoder.cc
src/Backend/satorderencoder.h
src/Backend/sattranslator.cc
src/Backend/sattranslator.h
src/Collections/array.h
src/Collections/cppvector.h
src/Collections/hashset.h
src/Collections/hashtable.h
src/Collections/structs.cc
src/Collections/structs.h
src/Encoders/elementencoding.h
src/Encoders/functionencoding.h
src/Encoders/naiveencoder.cc
src/Encoders/orderencoding.h
src/Test/logicopstest.cc
src/Test/ltelemconsttest.cc
src/Test/ordergraphtest.cc
src/Test/tablefuncencodetest.cc
src/Test/tablepredicencodetest.cc
src/Tuner/tunable.cc
src/Tuner/tunable.h
src/classlist.h
src/csolver.cc
src/csolver.h
src/mymemory.h

index 8cc126ab031c7aeb1fec0a869cf49127fe565635..749bf8e7ed596c1abcd2434a4bbf753f464025c2 100644 (file)
@@ -4,8 +4,8 @@
 #include "ops.h"
 
 class ASTNode {
- public:
-  ASTNode(ASTNodeType _type) : type(_type) {}
+public:
+       ASTNode(ASTNodeType _type) : type(_type) {}
        ASTNodeType type;
        MEMALLOC;
 };
index 62f6bff6fc7c9e4c133aa10ce2f0abb04480761e..6ec11935080b208c4202238ed614109266a6c2cc 100644 (file)
@@ -40,7 +40,6 @@ BooleanLogic::BooleanLogic(CSolver *solver, LogicOp _op, Boolean **array, uint a
        Boolean(LOGICOP),
        op(_op),
        inputs(array, asize) {
-       solver->allBooleans.push(this);
 }
 
 BooleanPredicate::~BooleanPredicate() {
index 4bab81119c939549c110b9dd8ff3942c4ea94626..c9722a91ed8c0210fc05cb543bd3a85c8701944d 100644 (file)
@@ -18,7 +18,7 @@
 #define GETBOOLEANVALUE(b) (b->boolVal)
 
 class Boolean : public ASTNode {
- public:
+public:
        Boolean(ASTNodeType _type);
        virtual ~Boolean() {}
        Polarity polarity;
@@ -28,7 +28,7 @@ class Boolean : public ASTNode {
 };
 
 class BooleanVar : public Boolean {
- public:
+public:
        BooleanVar(VarType t);
        VarType vtype;
        Edge var;
@@ -36,7 +36,7 @@ class BooleanVar : public Boolean {
 };
 
 class BooleanOrder : public Boolean {
- public:
+public:
        BooleanOrder(Order *_order, uint64_t _first, uint64_t _second);
        Order *order;
        uint64_t first;
@@ -45,19 +45,19 @@ class BooleanOrder : public Boolean {
 };
 
 class BooleanPredicate : public Boolean {
- public:
+public:
        BooleanPredicate(Predicate *_predicate, Element **_inputs, uint _numInputs, Boolean *_undefinedStatus);
        ~BooleanPredicate();
        Predicate *predicate;
        FunctionEncoding encoding;
        Array<Element *> inputs;
        Boolean *undefStatus;
-       FunctionEncoding * getFunctionEncoding() {return &encoding;}
+       FunctionEncoding *getFunctionEncoding() {return &encoding;}
        MEMALLOC;
 };
 
 class BooleanLogic : public Boolean {
- public:
+public:
        BooleanLogic(CSolver *solver, LogicOp _op, Boolean **array, uint asize);
        LogicOp op;
        Array<Boolean *> inputs;
index be4f77b5ffa50a13fe76cb938aa05e60b4b72ea4..32b372a0ba3d279aca029c9428e2e61515258cff 100644 (file)
@@ -26,7 +26,7 @@ ElementFunction::ElementFunction(Function *_function, Element **array, uint numA
 }
 
 ElementConst::ElementConst(uint64_t _value, VarType _type) : Element(ELEMCONST), value(_value) {
-       uint64_t array[]={value};
+       uint64_t array[] = {value};
        set = new Set(_type, array, 1);
 }
 
index 6a8ea956a6fc0b788e4d79fc0296b196dc9e4da2..f563586e77b2b5034ddcc18132cadc072aba5675 100644 (file)
@@ -11,7 +11,7 @@
 #define GETELEMENTTYPE(o) (o->type)
 #define GETELEMENTPARENTS(o) (&((Element *)o)->parents)
 class Element : public ASTNode {
- public:
+public:
        Element(ASTNodeType type);
        virtual ~Element();
        Vector<ASTNode *> parents;
@@ -20,7 +20,7 @@ class Element : public ASTNode {
 };
 
 class ElementConst : public Element {
- public:
+public:
        ElementConst(uint64_t value, VarType type);
        ~ElementConst();
        Set *set;
@@ -29,14 +29,14 @@ class ElementConst : public Element {
 };
 
 class ElementSet : public Element {
- public:
+public:
        ElementSet(Set *s);
        Set *set;
        MEMALLOC;
 };
 
 class ElementFunction : public Element {
- public:
+public:
        ElementFunction(Function *function, Element **array, uint numArrays, Boolean *overflowstatus);
        ~ElementFunction();
        Function *function;
index 9b6f2547ec1a3c7cd02436227ed1bafbc215522d..2cd5ccae7f7ef699cfa2b5c3ea080e11ac912069 100644 (file)
@@ -8,15 +8,15 @@
 #define GETFUNCTIONTYPE(o) (((Function *)o)->type)
 
 class Function {
- public:
-  Function(FunctionType _type) : type(_type) {}
+public:
+       Function(FunctionType _type) : type(_type) {}
        FunctionType type;
        MEMALLOC;
        virtual ~Function() {}
 };
 
 class FunctionOperator : public Function {
- public:
+public:
        ArithOp op;
        Array<Set *> domains;
        Set *range;
@@ -28,7 +28,7 @@ class FunctionOperator : public Function {
 };
 
 class FunctionTable : public Function {
- public:
+public:
        Table *table;
        UndefinedBehavior undefBehavior;
        FunctionTable (Table *table, UndefinedBehavior behavior);
index b0359d3d5165d9e1241f6e7affa35bd749f311d1..3c2f937d2d54e14117a5ac461697f9c27ef13a5d 100644 (file)
@@ -3,7 +3,7 @@
 #include "set.h"
 
 class MutableSet : public Set {
- public:
+public:
        MutableSet(VarType t);
        void addElementMSet(uint64_t element);
        MEMALLOC;
index cdc3d52c9efdea7d98d21002dccc4a6e2b183745..debd37cf69defe4107d34c8091a69c1f9d214a16 100644 (file)
@@ -39,6 +39,6 @@ Order::~Order() {
                delete elementTable;
        }
        if (graph != NULL) {
-               deleteOrderGraph(graph);
+               delete graph;
        }
 }
index 164578630697960e54f045cff417ed3fc80b2736..8d2124073968ce7a8c4cea3c09df018671b1fd2f 100644 (file)
@@ -9,13 +9,13 @@
 #include "orderpair.h"
 
 class Order {
- public:
+public:
        Order(OrderType type, Set *set);
        ~Order();
        OrderType type;
        Set *set;
        HashTableOrderPair *orderPairTable;
-       HashSetOrderElementelementTable;
+       HashSetOrderElement *elementTable;
        OrderGraph *graph;
        Vector<BooleanOrder *> constraints;
        OrderEncoding order;
index feff67a946f7cb807b6f8970df3f4f024213c94d..0e04668a6ac719d8c49582f3982fe062734fad35 100644 (file)
@@ -3,7 +3,7 @@
 #include "set.h"
 #include "table.h"
 
-PredicateOperator::PredicateOperator(CompOp _op, Set **domain, uint numDomain) : Predicate(OPERATORPRED) , op(_op), domains(domain, numDomain) {
+PredicateOperator::PredicateOperator(CompOp _op, Set **domain, uint numDomain) : Predicate(OPERATORPRED), op(_op), domains(domain, numDomain) {
 }
 
 PredicateTable::PredicateTable(Table *_table, UndefinedBehavior _undefBehavior) : Predicate(TABLEPRED), table(_table), undefinedbehavior(_undefBehavior) {
index 96f462d499e140195508c08fa23e6de856856844..46bc5af83ff9b9e91449037d7f4ea6ca49851f71 100644 (file)
@@ -8,15 +8,15 @@
 #define GETPREDICATETYPE(o) (((Predicate *)(o))->type)
 
 class Predicate {
- public:
-  Predicate(PredicateType _type) : type(_type) {}
+public:
+       Predicate(PredicateType _type) : type(_type) {}
        virtual ~Predicate() {}
        PredicateType type;
        MEMALLOC;
 };
 
 class PredicateOperator : public Predicate {
- public:
+public:
        PredicateOperator(CompOp op, Set **domain, uint numDomain);
        bool evalPredicateOperator(uint64_t *inputs);
        CompOp op;
@@ -25,7 +25,7 @@ class PredicateOperator : public Predicate {
 };
 
 class PredicateTable : public Predicate {
- public:
+public:
        PredicateTable(Table *table, UndefinedBehavior undefBehavior);
        Table *table;
        UndefinedBehavior undefinedbehavior;
index f659b4e994cf34fbcc121546981e9bc2709dcf8b..f32fc91b0e945d74ea94f4e8df5e250ce94e17fe 100644 (file)
@@ -2,9 +2,9 @@
 #include "boolean.h"
 #include "csolver.h"
 
-void replaceBooleanWithTrue(CSolver * This, Boolean *bexpr) {
-       if (This->constraints.contains(bexpr)) {
-               This->constraints.remove(bexpr);
+void CSolver::replaceBooleanWithTrue(Boolean *bexpr) {
+       if (constraints.contains(bexpr)) {
+               constraints.remove(bexpr);
        }
 
        uint size = bexpr->parents.getSize();
@@ -13,28 +13,28 @@ void replaceBooleanWithTrue(CSolver * This, Boolean *bexpr) {
                BooleanLogic *logicop = (BooleanLogic *) parent;
                switch (logicop->op) {
                case L_AND:
-                       handleANDTrue(This, logicop, bexpr);
+                       handleANDTrue(logicop, bexpr);
                        break;
                case L_OR:
-                       replaceBooleanWithTrue(This, parent);
+                       replaceBooleanWithTrue(parent);
                        break;
                case L_NOT:
-                       replaceBooleanWithFalse(This, parent);
+                       replaceBooleanWithFalse(parent);
                        break;
                case L_XOR:
                        handleXORTrue(logicop, bexpr);
                        break;
                case L_IMPLIES:
-                       handleIMPLIESTrue(This, logicop, bexpr);
+                       handleIMPLIESTrue(logicop, bexpr);
                        break;
                }
        }
 }
 
-void replaceBooleanWithBoolean(CSolver * This, Boolean *oldb, Boolean *newb) {
-       if (This->constraints.contains(oldb)) {
-               This->constraints.remove(oldb);
-               This->constraints.add(newb);
+void CSolver::replaceBooleanWithBoolean(Boolean *oldb, Boolean *newb) {
+       if (constraints.contains(oldb)) {
+               constraints.remove(oldb);
+               constraints.add(newb);
        }
 
        uint size = oldb->parents.getSize();
@@ -62,31 +62,31 @@ void handleXORTrue(BooleanLogic *bexpr, Boolean *child) {
        bexpr->op = L_NOT;
 }
 
-void handleXORFalse(CSolver * This, BooleanLogic *bexpr, Boolean *child) {
+void CSolver::handleXORFalse(BooleanLogic *bexpr, Boolean *child) {
        uint size = bexpr->inputs.getSize();
        Boolean *b = bexpr->inputs.get(0);
        uint otherindex = (b == child) ? 1 : 0;
-       replaceBooleanWithBoolean(This, (Boolean *)bexpr, bexpr->inputs.get(otherindex));
+       replaceBooleanWithBoolean(bexpr, bexpr->inputs.get(otherindex));
 }
 
-void handleIMPLIESTrue(CSolver * This, BooleanLogic *bexpr, Boolean *child) {
+void CSolver::handleIMPLIESTrue(BooleanLogic *bexpr, Boolean *child) {
        uint size = bexpr->inputs.getSize();
        Boolean *b = bexpr->inputs.get(0);
        if (b == child) {
                //Replace with other term
-               replaceBooleanWithBoolean(This, (Boolean *)bexpr, bexpr->inputs.get(1));
+               replaceBooleanWithBoolean(bexpr, bexpr->inputs.get(1));
        } else {
                //Statement is true...
-               replaceBooleanWithTrue(This, (Boolean *)bexpr);
+               replaceBooleanWithTrue(bexpr);
        }
 }
 
-void handleIMPLIESFalse(CSolver * This, BooleanLogic *bexpr, Boolean *child) {
+void CSolver::handleIMPLIESFalse(BooleanLogic *bexpr, Boolean *child) {
        uint size = bexpr->inputs.getSize();
        Boolean *b = bexpr->inputs.get(0);
        if (b == child) {
                //Statement is true...
-               replaceBooleanWithTrue(This, (Boolean *)bexpr);
+               replaceBooleanWithTrue(bexpr);
        } else {
                //Make into negation of first term
                bexpr->inputs.get(1);
@@ -94,11 +94,11 @@ void handleIMPLIESFalse(CSolver * This, BooleanLogic *bexpr, Boolean *child) {
        }
 }
 
-void handleANDTrue(CSolver * This, BooleanLogic *bexpr, Boolean *child) {
+void CSolver::handleANDTrue(BooleanLogic *bexpr, Boolean *child) {
        uint size = bexpr->inputs.getSize();
 
        if (size == 1) {
-               replaceBooleanWithTrue(This, (Boolean *)bexpr);
+               replaceBooleanWithTrue(bexpr);
                return;
        }
 
@@ -110,15 +110,15 @@ void handleANDTrue(CSolver * This, BooleanLogic *bexpr, Boolean *child) {
        }
 
        if (size == 2) {
-               replaceBooleanWithBoolean(This, (Boolean *)bexpr, bexpr->inputs.get(0));
+               replaceBooleanWithBoolean(bexpr, bexpr->inputs.get(0));
        }
 }
 
-void handleORFalse(CSolver * This, BooleanLogic *bexpr, Boolean *child) {
+void CSolver::handleORFalse(BooleanLogic *bexpr, Boolean *child) {
        uint size = bexpr->inputs.getSize();
 
        if (size == 1) {
-               replaceBooleanWithFalse(This, (Boolean *) bexpr);
+               replaceBooleanWithFalse(bexpr);
        }
 
        for (uint i = 0; i < size; i++) {
@@ -129,35 +129,35 @@ void handleORFalse(CSolver * This, BooleanLogic *bexpr, Boolean *child) {
        }
 
        if (size == 2) {
-               replaceBooleanWithBoolean(This, (Boolean *)bexpr, bexpr->inputs.get(0));
+               replaceBooleanWithBoolean(bexpr, bexpr->inputs.get(0));
        }
 }
 
-void replaceBooleanWithFalse(CSolver * This, Boolean *bexpr) {
-       if (This->constraints.contains(bexpr)) {
-               This->unsat=true;
-               This->constraints.remove(bexpr);
+void CSolver::replaceBooleanWithFalse(Boolean *bexpr) {
+       if (constraints.contains(bexpr)) {
+               setUnSAT();
+               constraints.remove(bexpr);
        }
-       
+
        uint size = bexpr->parents.getSize();
        for (uint i = 0; i < size; i++) {
                Boolean *parent = bexpr->parents.get(i);
                BooleanLogic *logicop = (BooleanLogic *) parent;
                switch (logicop->op) {
                case L_AND:
-                       replaceBooleanWithFalse(This, parent);
+                       replaceBooleanWithFalse(parent);
                        break;
                case L_OR:
-                       handleORFalse(This, logicop, bexpr);
+                       handleORFalse(logicop, bexpr);
                        break;
                case L_NOT:
-                       replaceBooleanWithTrue(This, parent);
+                       replaceBooleanWithTrue(parent);
                        break;
                case L_XOR:
-                       handleXORFalse(This, logicop, bexpr);
+                       handleXORFalse(logicop, bexpr);
                        break;
                case L_IMPLIES:
-                       handleIMPLIESFalse(This, logicop, bexpr);
+                       handleIMPLIESFalse(logicop, bexpr);
                        break;
                }
        }
index 385c8fad609c716037f8180043fb488c70b1aa99..5387e4ef15ec0aa37c4a9d98a2be1c88a556bbac 100644 (file)
@@ -2,14 +2,6 @@
 #define REWRITER_H
 #include "classlist.h"
 
-void replaceBooleanWithTrue(CSolver * This, Boolean *bexpr);
-void replaceBooleanWithFalse(CSolver * This, Boolean *bexpr);
-void replaceBooleanWithBoolean(CSolver * This, Boolean *oldb, Boolean *newb);
 void handleXORTrue(BooleanLogic *bexpr, Boolean *child);
-void handleXORFalse(CSolver * This, BooleanLogic *bexpr, Boolean *child);
-void handleIMPLIESTrue(CSolver * This, BooleanLogic *bexpr, Boolean *child);
-void handleIMPLIESFalse(CSolver * This, BooleanLogic *bexpr, Boolean *child);
-void handleANDTrue(CSolver * This, BooleanLogic *bexpr, Boolean *child);
-void handleORFalse(CSolver * This, BooleanLogic *bexpr, Boolean *child);
 
 #endif
index 9303fa843cc059d6bb6348641b7b50b1bde8e431..bb246b6f690d7e1c0542bb869f6f2b2e7780a441 100644 (file)
@@ -13,7 +13,7 @@
 #include "mymemory.h"
 
 class Set {
- public:
+public:
        Set(VarType t);
        Set(VarType t, uint64_t *elements, uint num);
        Set(VarType t, uint64_t lowrange, uint64_t highrange);
@@ -21,7 +21,7 @@ class Set {
        bool exists(uint64_t element);
        uint getSize();
        uint64_t getElement(uint index);
-       
+
        VarType type;
        bool isRange;
        uint64_t low;//also used to count unique items
index 016b3cce41ff49e866540555be390d09449b1e28..d54aefbac1b03c3babb4a3e0a530cdf24ce0088b 100644 (file)
@@ -21,7 +21,7 @@ void Table::addNewTableEntry(uint64_t *inputs, uint inputSize, uint64_t result)
        ASSERT(status);
 }
 
-TableEntry * Table::getTableEntry(uint64_t *inputs, uint inputSize) {
+TableEntry *Table::getTableEntry(uint64_t *inputs, uint inputSize) {
        TableEntry *temp = allocTableEntry(inputs, inputSize, -1);
        TableEntry *result = entries->get(temp);
        deleteTableEntry(temp);
index f232615a848b63c327a3074659aab0b556282fe5..28b13e4716f34b3e6c2b9e576a47181be20cdc1d 100644 (file)
@@ -5,7 +5,7 @@
 #include "structs.h"
 
 class Table {
- public:
+public:
        Table(Set **domains, uint numDomain, Set *range);
        void addNewTableEntry(uint64_t *inputs, uint inputSize, uint64_t result);
        TableEntry *getTableEntry(uint64_t *inputs, uint inputSize);
index c4632dafcc376abc1a78f379ce0f65c22935867b..c0cd678f7130807ec7c56959b0c89f91c39a29e2 100644 (file)
@@ -1,19 +1,12 @@
 #include "orderedge.h"
 #include "ordergraph.h"
 
-OrderEdge *allocOrderEdge(OrderNode *source, OrderNode *sink) {
-       OrderEdge *This = (OrderEdge *) ourmalloc(sizeof(OrderEdge));
-       This->source = source;
-       This->sink = sink;
-       This->polPos = false;
-       This->polNeg = false;
-       This->mustPos = false;
-       This->mustNeg = false;
-       This->pseudoPos = false;
-       return This;
+OrderEdge::OrderEdge(OrderNode *_source, OrderNode *_sink) {
+       source = _source;
+       sink = _sink;
+       polPos = false;
+       polNeg = false;
+       mustPos = false;
+       mustNeg = false;
+       pseudoPos = false;
 }
-
-void deleteOrderEdge(OrderEdge *This) {
-       ourfree(This);
-}
-
index 21fa9034fb8d061e5f6f3bf8fd77dabe6c2b91ec..9b1af29f2c46901d9d831b7085eac972ed2c9d93 100644 (file)
 #include "classlist.h"
 #include "mymemory.h"
 
-struct OrderEdge {
+class OrderEdge {
+public:
+       OrderEdge(OrderNode *begin, OrderNode *end);
+
        OrderNode *source;
        OrderNode *sink;
        unsigned int polPos : 1;
@@ -18,15 +21,8 @@ struct OrderEdge {
        unsigned int mustPos : 1;
        unsigned int mustNeg : 1;
        unsigned int pseudoPos : 1;
+       MEMALLOC;
 };
 
-OrderEdge *allocOrderEdge(OrderNode *begin, OrderNode *end);
-void deleteOrderEdge(OrderEdge *This);
-void setPseudoPos(OrderGraph *graph, OrderEdge *edge);
-void setMustPos(OrderGraph *graph, OrderEdge *edge);
-void setMustNeg(OrderGraph *graph, OrderEdge *edge);
-void setPolPos(OrderGraph *graph, OrderEdge *edge);
-void setPolNeg(OrderGraph *graph, OrderEdge *edge);
-
 #endif/* ORDEREDGE_H */
 
index 05e2ae00f22765690b92726b13f3513cf5de0102..5d9420692f054d279aa3d2c14b0a6500b1018532 100644 (file)
@@ -10,7 +10,7 @@
 #include "tunable.h"
 
 void DFS(OrderGraph *graph, Vector<OrderNode *> *finishNodes) {
-       HSIteratorOrderNode *iterator = graph->nodes->iterator();
+       HSIteratorOrderNode *iterator = graph->getNodes();
        while (iterator->hasNext()) {
                OrderNode *node = iterator->next();
                if (node->status == NOTVISITED) {
@@ -39,15 +39,15 @@ void DFSReverse(OrderGraph *graph, Vector<OrderNode *> *finishNodes) {
 }
 
 void DFSNodeVisit(OrderNode *node, Vector<OrderNode *> *finishNodes, bool isReverse, bool mustvisit, uint sccNum) {
-       HSIteratorOrderEdge *iterator = isReverse ? node->inEdges->iterator() : node->outEdges->iterator();
+       HSIteratorOrderEdge *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;
+               if (!edge->polPos && !edge->pseudoPos)  //Ignore edges that do not have positive polarity
+                       continue;
 
                OrderNode *child = isReverse ? edge->source : edge->sink;
 
@@ -65,7 +65,7 @@ void DFSNodeVisit(OrderNode *node, Vector<OrderNode *> *finishNodes, bool isReve
 }
 
 void resetNodeInfoStatusSCC(OrderGraph *graph) {
-       HSIteratorOrderNode *iterator = graph->nodes->iterator();
+       HSIteratorOrderNode *iterator = graph->getNodes();
        while (iterator->hasNext()) {
                iterator->next()->status = NOTVISITED;
        }
@@ -80,43 +80,43 @@ void computeStronglyConnectedComponentGraph(OrderGraph *graph) {
        resetNodeInfoStatusSCC(graph);
 }
 
-bool isMustBeTrueNode(OrderNode* node){
-       HSIteratorOrderEdge* iterator = node->inEdges->iterator();
-       while(iterator->hasNext()){
-               OrderEdgeedge = iterator->next();
-               if(!edge->mustPos)
+bool isMustBeTrueNode(OrderNode *node) {
+       HSIteratorOrderEdge *iterator = node->inEdges.iterator();
+       while (iterator->hasNext()) {
+               OrderEdge *edge = iterator->next();
+               if (!edge->mustPos)
                        return false;
        }
        delete iterator;
-       iterator = node->outEdges->iterator();
-       while(iterator->hasNext()){
-               OrderEdgeedge = iterator->next();
-               if(!edge->mustPos)
+       iterator = node->outEdges.iterator();
+       while (iterator->hasNext()) {
+               OrderEdge *edge = iterator->next();
+               if (!edge->mustPos)
                        return false;
        }
        delete iterator;
        return true;
 }
 
-void bypassMustBeTrueNode(CSolver *This, OrderGraph* graph, OrderNode* node){
-       HSIteratorOrderEdge* iterin = node->inEdges->iterator();
-       while(iterin->hasNext()){
-               OrderEdgeinEdge = iterin->next();
-               OrderNodesrcNode = inEdge->source;
-               srcNode->outEdges->remove(inEdge);
-               HSIteratorOrderEdge* iterout = node->outEdges->iterator();
-               while(iterout->hasNext()){
-                       OrderEdgeoutEdge = iterout->next();
-                       OrderNodesinkNode = outEdge->sink;
-                       sinkNode->inEdges->remove(outEdge);
+void bypassMustBeTrueNode(CSolver *This, OrderGraph *graph, OrderNode *node) {
+       HSIteratorOrderEdge *iterin = node->inEdges.iterator();
+       while (iterin->hasNext()) {
+               OrderEdge *inEdge = iterin->next();
+               OrderNode *srcNode = inEdge->source;
+               srcNode->outEdges.remove(inEdge);
+               HSIteratorOrderEdge *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 ...
-                       OrderEdge *newEdge =getOrderEdgeFromOrderGraph(graph, srcNode, sinkNode);
+                       OrderEdge *newEdge = graph->getOrderEdgeFromOrderGraph(srcNode, sinkNode);
                        newEdge->mustPos = true;
                        newEdge->polPos = true;
                        if (newEdge->mustNeg)
-                               This->unsat = true;
-                       srcNode->outEdges->add(newEdge);
-                       sinkNode->inEdges->add(newEdge);
+                               This->setUnSAT();
+                       srcNode->outEdges.add(newEdge);
+                       sinkNode->inEdges.add(newEdge);
                }
                delete iterout;
        }
@@ -124,20 +124,20 @@ void bypassMustBeTrueNode(CSolver *This, OrderGraph* graph, OrderNode* node){
 }
 
 void removeMustBeTrueNodes(CSolver *This, OrderGraph *graph) {
-       HSIteratorOrderNode* iterator = graph->nodes->iterator();
-       while(iterator->hasNext()) {
-               OrderNodenode = iterator->next();
-               if(isMustBeTrueNode(node)){
-                       bypassMustBeTrueNode(This,graph, node);
+       HSIteratorOrderNode *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. */
+    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;
@@ -146,14 +146,14 @@ void completePartialOrderGraph(OrderGraph *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;
@@ -168,7 +168,7 @@ void completePartialOrderGraph(OrderGraph *graph) {
                        for (uint j = 0; j < rSize; j++) {
                                OrderNode *rnode = sccNodes.get(j);
                                //Compute source sets
-                               HSIteratorOrderEdge *iterator = rnode->inEdges->iterator();
+                               HSIteratorOrderEdge *iterator = rnode->inEdges.iterator();
                                while (iterator->hasNext()) {
                                        OrderEdge *edge = iterator->next();
                                        OrderNode *parent = edge->source;
@@ -180,27 +180,27 @@ void completePartialOrderGraph(OrderGraph *graph) {
                                }
                                delete iterator;
                        }
-                       for (uint j=0; j < rSize; j++) {
+                       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();
+                               HashSetOrderNode *set = (j == 0) ? sources : sources->copy();
                                table->put(rnode, set);
 
                                //Use source sets to compute pseudoPos edges
-                               HSIteratorOrderEdge *iterator = node->inEdges->iterator();
+                               HSIteratorOrderEdge *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(graph, rnode, parent);
+                                               OrderEdge *newedge = graph->getOrderEdgeFromOrderGraph(rnode, parent);
                                                newedge->pseudoPos = true;
                                        }
                                }
                                delete iterator;
                        }
-                       
+
                        sccNodes.clear();
                }
        }
@@ -211,7 +211,7 @@ void completePartialOrderGraph(OrderGraph *graph) {
 }
 
 void DFSMust(OrderGraph *graph, Vector<OrderNode *> *finishNodes) {
-       HSIteratorOrderNode *iterator = graph->nodes->iterator();
+       HSIteratorOrderNode *iterator = graph->getNodes();
        while (iterator->hasNext()) {
                OrderNode *node = iterator->next();
                if (node->status == NOTVISITED) {
@@ -235,7 +235,7 @@ void DFSClearContradictions(CSolver *solver, OrderGraph *graph, Vector<OrderNode
 
                {
                        //Compute source sets
-                       HSIteratorOrderEdge *iterator = node->inEdges->iterator();
+                       HSIteratorOrderEdge *iterator = node->inEdges.iterator();
                        while (iterator->hasNext()) {
                                OrderEdge *edge = iterator->next();
                                OrderNode *parent = edge->source;
@@ -252,19 +252,19 @@ void DFSClearContradictions(CSolver *solver, OrderGraph *graph, Vector<OrderNode
                        HSIteratorOrderNode *srciterator = sources->iterator();
                        while (srciterator->hasNext()) {
                                OrderNode *srcnode = srciterator->next();
-                               OrderEdge *newedge = getOrderEdgeFromOrderGraph(graph, srcnode, node);
+                               OrderEdge *newedge = graph->getOrderEdgeFromOrderGraph(srcnode, node);
                                newedge->mustPos = true;
                                newedge->polPos = true;
                                if (newedge->mustNeg)
-                                       solver->unsat = true;
-                               srcnode->outEdges->add(newedge);
-                               node->inEdges->add(newedge);
+                                       solver->setUnSAT();
+                               srcnode->outEdges.add(newedge);
+                               node->inEdges.add(newedge);
                        }
                        delete srciterator;
                }
                {
                        //Use source sets to compute mustPos edges
-                       HSIteratorOrderEdge *iterator =node->inEdges->iterator();
+                       HSIteratorOrderEdge *iterator = node->inEdges.iterator();
                        while (iterator->hasNext()) {
                                OrderEdge *edge = iterator->next();
                                OrderNode *parent = edge->source;
@@ -272,14 +272,14 @@ void DFSClearContradictions(CSolver *solver, OrderGraph *graph, Vector<OrderNode
                                        edge->mustPos = true;
                                        edge->polPos = true;
                                        if (edge->mustNeg)
-                                               solver->unsat = true;
+                                               solver->setUnSAT();
                                }
                        }
                        delete iterator;
                }
                {
                        //Use source sets to compute mustNeg for edges that would introduce cycle if true
-                       HSIteratorOrderEdge *iterator = node->outEdges->iterator();
+                       HSIteratorOrderEdge *iterator = node->outEdges.iterator();
                        while (iterator->hasNext()) {
                                OrderEdge *edge = iterator->next();
                                OrderNode *child = edge->sink;
@@ -287,7 +287,7 @@ void DFSClearContradictions(CSolver *solver, OrderGraph *graph, Vector<OrderNode
                                        edge->mustNeg = true;
                                        edge->polNeg = true;
                                        if (edge->mustPos)
-                                               solver->unsat = true;
+                                               solver->setUnSAT();
                                }
                        }
                        delete iterator;
@@ -303,7 +303,7 @@ void DFSClearContradictions(CSolver *solver, OrderGraph *graph, Vector<OrderNode
    must be true because of transitivity from other must be true
    edges. */
 
-void reachMustAnalysis(CSolver * solver, OrderGraph *graph, bool computeTransitiveClosure) {
+void reachMustAnalysis(CSolver *solver, OrderGraph *graph, bool computeTransitiveClosure) {
        Vector<OrderNode *> finishNodes;
        //Topologically sort the mustPos edge graph
        DFSMust(graph, &finishNodes);
@@ -318,16 +318,16 @@ void reachMustAnalysis(CSolver * solver, OrderGraph *graph, bool computeTransiti
    had one). */
 
 void localMustAnalysisTotal(CSolver *solver, OrderGraph *graph) {
-       HSIteratorOrderEdge *iterator = graph->edges->iterator();
+       HSIteratorOrderEdge *iterator = graph->getEdges();
        while (iterator->hasNext()) {
                OrderEdge *edge = iterator->next();
                if (edge->mustPos) {
-                       OrderEdge *invEdge = getInverseOrderEdge(graph, edge);
+                       OrderEdge *invEdge = graph->getInverseOrderEdge(edge);
                        if (invEdge != NULL) {
                                if (!invEdge->mustPos) {
                                        invEdge->polPos = false;
                                } else {
-                                       solver->unsat = true;
+                                       solver->setUnSAT();
                                }
                                invEdge->mustNeg = true;
                                invEdge->polNeg = true;
@@ -343,21 +343,22 @@ void localMustAnalysisTotal(CSolver *solver, OrderGraph *graph) {
     polarity. */
 
 void localMustAnalysisPartial(CSolver *solver, OrderGraph *graph) {
-       HSIteratorOrderEdge *iterator = graph->edges->iterator();
+       HSIteratorOrderEdge *iterator = graph->getEdges();
        while (iterator->hasNext()) {
                OrderEdge *edge = iterator->next();
                if (edge->mustPos) {
                        if (!edge->mustNeg) {
                                edge->polNeg = false;
                        } else
-                               solver->unsat = true;
+                               solver->setUnSAT();
 
-                       OrderEdge *invEdge = getInverseOrderEdge(graph, edge);
+                       OrderEdge *invEdge = graph->getInverseOrderEdge(edge);
                        if (invEdge != NULL) {
                                if (!invEdge->mustPos)
                                        invEdge->polPos = false;
                                else
-                                       solver->unsat = true;
+                                       solver->setUnSAT();
+
                                invEdge->mustNeg = true;
                                invEdge->polNeg = true;
                        }
index 19240cf59855d681e9d103fbe5fd4db7d487e033..57a6e5c1d011398bf43311d1aa0f4f828f3a5764 100644 (file)
@@ -18,8 +18,8 @@ void DFS(OrderGraph *graph, Vector<OrderNode *> *finishNodes);
 void DFSReverse(OrderGraph *graph, Vector<OrderNode *> *finishNodes);
 void completePartialOrderGraph(OrderGraph *graph);
 void resetNodeInfoStatusSCC(OrderGraph *graph);
-bool isMustBeTrueNode(OrderNodenode);
-void bypassMustBeTrueNode(CSolver *This, OrderGraph* graph, OrderNode* node);
+bool isMustBeTrueNode(OrderNode *node);
+void bypassMustBeTrueNode(CSolver *This, OrderGraph *graph, OrderNode *node);
 void removeMustBeTrueNodes(CSolver *This, OrderGraph *graph);
 void completePartialOrderGraph(OrderGraph *graph);
 void DFSMust(OrderGraph *graph, Vector<OrderNode *> *finishNodes);
index ee970e1d551c1f3281e541a092c318f57f33cc79..9942b740fec5ee4841fd351de943231aa94f1528 100644 (file)
@@ -5,64 +5,61 @@
 #include "ordergraph.h"
 #include "order.h"
 
-OrderGraph *allocOrderGraph(Order *order) {
-       OrderGraph *This = (OrderGraph *) ourmalloc(sizeof(OrderGraph));
-       This->nodes = new HashSetOrderNode();
-       This->edges = new HashSetOrderEdge();
-       This->order = order;
-       return This;
+OrderGraph::OrderGraph(Order *_order) :
+       nodes(new HashSetOrderNode()),
+       edges(new HashSetOrderEdge()),
+       order(_order) {
 }
 
 OrderGraph *buildOrderGraph(Order *order) {
-       OrderGraph *orderGraph = allocOrderGraph(order);
+       OrderGraph *orderGraph = new OrderGraph(order);
        uint constrSize = order->constraints.getSize();
        for (uint j = 0; j < constrSize; j++) {
-               addOrderConstraintToOrderGraph(orderGraph, order->constraints.get(j));
+               orderGraph->addOrderConstraintToOrderGraph(order->constraints.get(j));
        }
        return orderGraph;
 }
 
 //Builds only the subgraph for the must order graph.
 OrderGraph *buildMustOrderGraph(Order *order) {
-       OrderGraph *orderGraph = allocOrderGraph(order);
+       OrderGraph *orderGraph = new OrderGraph(order);
        uint constrSize = order->constraints.getSize();
        for (uint j = 0; j < constrSize; j++) {
-               addMustOrderConstraintToOrderGraph(orderGraph, order->constraints.get(j));
+               orderGraph->addMustOrderConstraintToOrderGraph(order->constraints.get(j));
        }
        return orderGraph;
 }
 
-void addOrderEdge(OrderGraph *graph, OrderNode *node1, OrderNode *node2, BooleanOrder *constr) {
+void OrderGraph::addOrderEdge(OrderNode *node1, OrderNode *node2, BooleanOrder *constr) {
        Polarity polarity = constr->polarity;
        BooleanValue mustval = constr->boolVal;
-       Order *order = graph->order;
        switch (polarity) {
        case P_BOTHTRUEFALSE:
        case P_TRUE: {
-               OrderEdge *_1to2 = getOrderEdgeFromOrderGraph(graph, node1, node2);
+               OrderEdge *_1to2 = getOrderEdgeFromOrderGraph(node1, node2);
                if (mustval == BV_MUSTBETRUE || mustval == BV_UNSAT)
                        _1to2->mustPos = true;
                _1to2->polPos = true;
-               addNewOutgoingEdge(node1, _1to2);
-               addNewIncomingEdge(node2, _1to2);
+               node1->addNewOutgoingEdge(_1to2);
+               node2->addNewIncomingEdge(_1to2);
                if (constr->polarity == P_TRUE)
                        break;
        }
        case P_FALSE: {
                if (order->type == TOTAL) {
-                       OrderEdge *_2to1 = getOrderEdgeFromOrderGraph(graph, node2, node1);
+                       OrderEdge *_2to1 = getOrderEdgeFromOrderGraph( node2, node1);
                        if (mustval == BV_MUSTBEFALSE || mustval == BV_UNSAT)
                                _2to1->mustPos = true;
                        _2to1->polPos = true;
-                       addNewOutgoingEdge(node2, _2to1);
-                       addNewIncomingEdge(node1, _2to1);
+                       node2->addNewOutgoingEdge(_2to1);
+                       node1->addNewIncomingEdge(_2to1);
                } else {
-                       OrderEdge *_1to2 = getOrderEdgeFromOrderGraph(graph, node1, node2);
+                       OrderEdge *_1to2 = getOrderEdgeFromOrderGraph(node1, node2);
                        if (mustval == BV_MUSTBEFALSE || mustval == BV_UNSAT)
                                _1to2->mustNeg = true;
                        _1to2->polNeg = true;
-                       addNewOutgoingEdge(node1, _1to2);
-                       addNewIncomingEdge(node2, _1to2);
+                       node1->addNewOutgoingEdge(_1to2);
+                       node2->addNewIncomingEdge(_1to2);
                }
                break;
        }
@@ -72,33 +69,32 @@ void addOrderEdge(OrderGraph *graph, OrderNode *node1, OrderNode *node2, Boolean
        }
 }
 
-void addMustOrderEdge(OrderGraph *graph, OrderNode *node1, OrderNode *node2, BooleanOrder *constr) {
+void OrderGraph::addMustOrderEdge(OrderNode *node1, OrderNode *node2, BooleanOrder *constr) {
        BooleanValue mustval = constr->boolVal;
-       Order *order = graph->order;
        switch (mustval) {
        case BV_UNSAT:
        case BV_MUSTBETRUE: {
-               OrderEdge *_1to2 = getOrderEdgeFromOrderGraph(graph, node1, node2);
+               OrderEdge *_1to2 = getOrderEdgeFromOrderGraph(node1, node2);
                _1to2->mustPos = true;
                _1to2->polPos = true;
-               addNewOutgoingEdge(node1, _1to2);
-               addNewIncomingEdge(node2, _1to2);
+               node1->addNewOutgoingEdge(_1to2);
+               node2->addNewIncomingEdge(_1to2);
                if (constr->boolVal == BV_MUSTBETRUE)
                        break;
        }
        case BV_MUSTBEFALSE: {
                if (order->type == TOTAL) {
-                       OrderEdge *_2to1 = getOrderEdgeFromOrderGraph(graph, node2, node1);
+                       OrderEdge *_2to1 = getOrderEdgeFromOrderGraph(node2, node1);
                        _2to1->mustPos = true;
                        _2to1->polPos = true;
-                       addNewOutgoingEdge(node2, _2to1);
-                       addNewIncomingEdge(node1, _2to1);
+                       node2->addNewOutgoingEdge(_2to1);
+                       node1->addNewIncomingEdge(_2to1);
                } else {
-                       OrderEdge *_1to2 = getOrderEdgeFromOrderGraph(graph, node1, node2);
+                       OrderEdge *_1to2 = getOrderEdgeFromOrderGraph(node1, node2);
                        _1to2->mustNeg = true;
                        _1to2->polNeg = true;
-                       addNewOutgoingEdge(node1, _1to2);
-                       addNewIncomingEdge(node2, _1to2);
+                       node1->addNewOutgoingEdge(_1to2);
+                       node2->addNewIncomingEdge(_1to2);
                }
                break;
        }
@@ -108,75 +104,74 @@ void addMustOrderEdge(OrderGraph *graph, OrderNode *node1, OrderNode *node2, Boo
        }
 }
 
-OrderNode *getOrderNodeFromOrderGraph(OrderGraph *graph, uint64_t id) {
-       OrderNode *node = allocOrderNode(id);
-       OrderNode *tmp = graph->nodes->get(node);
+OrderNode *OrderGraph::getOrderNodeFromOrderGraph(uint64_t id) {
+       OrderNode *node = new OrderNode(id);
+       OrderNode *tmp = nodes->get(node);
        if ( tmp != NULL) {
-               deleteOrderNode(node);
+               delete node;
                node = tmp;
        } else {
-               graph->nodes->add(node);
+               nodes->add(node);
        }
        return node;
 }
 
-OrderNode *lookupOrderNodeFromOrderGraph(OrderGraph *graph, uint64_t id) {
-       OrderNode node = {id, NULL, NULL, NOTVISITED, 0};
-       OrderNode *tmp = graph->nodes->get(&node);
+OrderNode *OrderGraph::lookupOrderNodeFromOrderGraph(uint64_t id) {
+       OrderNode node(id);
+       OrderNode *tmp = nodes->get(&node);
        return tmp;
 }
 
-OrderEdge *getOrderEdgeFromOrderGraph(OrderGraph *graph, OrderNode *begin, OrderNode *end) {
-       OrderEdge *edge = allocOrderEdge(begin, end);
-       OrderEdge *tmp = graph->edges->get(edge);
+OrderEdge *OrderGraph::getOrderEdgeFromOrderGraph(OrderNode *begin, OrderNode *end) {
+       OrderEdge *edge = new OrderEdge(begin, end);
+       OrderEdge *tmp = edges->get(edge);
        if ( tmp != NULL ) {
-               deleteOrderEdge(edge);
+               delete edge;
                edge = tmp;
        } else {
-               graph->edges->add(edge);
+               edges->add(edge);
        }
        return edge;
 }
 
-OrderEdge *lookupOrderEdgeFromOrderGraph(OrderGraph *graph, OrderNode *begin, OrderNode *end) {
-       OrderEdge edge = {begin, end, 0, 0, 0, 0, 0};
-       OrderEdge *tmp = graph->edges->get(&edge);
+OrderEdge *OrderGraph::lookupOrderEdgeFromOrderGraph(OrderNode *begin, OrderNode *end) {
+       OrderEdge edge(begin, end);
+       OrderEdge *tmp = edges->get(&edge);
        return tmp;
 }
 
-OrderEdge *getInverseOrderEdge(OrderGraph *graph, OrderEdge *edge) {
-       OrderEdge inverseedge = {edge->sink, edge->source, false, false, false, false, false};
-       OrderEdge *tmp = graph->edges->get(&inverseedge);
+OrderEdge *OrderGraph::getInverseOrderEdge(OrderEdge *edge) {
+       OrderEdge inverseedge(edge->sink, edge->source);
+       OrderEdge *tmp = edges->get(&inverseedge);
        return tmp;
 }
 
-void addOrderConstraintToOrderGraph(OrderGraph *graph, BooleanOrder *bOrder) {
-       OrderNode *from = getOrderNodeFromOrderGraph(graph, bOrder->first);
-       OrderNode *to = getOrderNodeFromOrderGraph(graph, bOrder->second);
-       addOrderEdge(graph, from, to, bOrder);
+void OrderGraph::addOrderConstraintToOrderGraph(BooleanOrder *bOrder) {
+       OrderNode *from = getOrderNodeFromOrderGraph(bOrder->first);
+       OrderNode *to = getOrderNodeFromOrderGraph(bOrder->second);
+       addOrderEdge(from, to, bOrder);
 }
 
-void addMustOrderConstraintToOrderGraph(OrderGraph *graph, BooleanOrder *bOrder) {
-       OrderNode *from = getOrderNodeFromOrderGraph(graph, bOrder->first);
-       OrderNode *to = getOrderNodeFromOrderGraph(graph, bOrder->second);
-       addMustOrderEdge(graph, from, to, bOrder);
+void OrderGraph::addMustOrderConstraintToOrderGraph(BooleanOrder *bOrder) {
+       OrderNode *from = getOrderNodeFromOrderGraph(bOrder->first);
+       OrderNode *to = getOrderNodeFromOrderGraph(bOrder->second);
+       addMustOrderEdge(from, to, bOrder);
 }
 
-void deleteOrderGraph(OrderGraph *graph) {
-       HSIteratorOrderNode *iterator = graph->nodes->iterator();
+OrderGraph::~OrderGraph() {
+       HSIteratorOrderNode *iterator = nodes->iterator();
        while (iterator->hasNext()) {
                OrderNode *node = iterator->next();
-               deleteOrderNode(node);
+               delete node;
        }
        delete iterator;
 
-       HSIteratorOrderEdge *eiterator = graph->edges->iterator();
+       HSIteratorOrderEdge *eiterator = edges->iterator();
        while (eiterator->hasNext()) {
                OrderEdge *edge = eiterator->next();
-               deleteOrderEdge(edge);
+               delete edge;
        }
        delete eiterator;
-       delete graph->nodes;
-       delete graph->edges;
-       ourfree(graph);
+       delete nodes;
+       delete edges;
 }
index 33f2b69cab59121f7e0033c0a3d44e2b6ba12d4d..eb756a8d63d1b50e1387b5cee12742dd41a06541 100644 (file)
 #include "structs.h"
 #include "mymemory.h"
 
-struct OrderGraph {
+class OrderGraph {
+public:
+       OrderGraph(Order *order);
+       ~OrderGraph();
+       void addOrderConstraintToOrderGraph(BooleanOrder *bOrder);
+       void addMustOrderConstraintToOrderGraph(BooleanOrder *bOrder);
+       OrderNode *getOrderNodeFromOrderGraph(uint64_t id);
+       OrderEdge *getOrderEdgeFromOrderGraph(OrderNode *begin, OrderNode *end);
+       OrderNode *lookupOrderNodeFromOrderGraph(uint64_t id);
+       OrderEdge *lookupOrderEdgeFromOrderGraph(OrderNode *begin, OrderNode *end);
+       void addOrderEdge(OrderNode *node1, OrderNode *node2, BooleanOrder *constr);
+       void addMustOrderEdge(OrderNode *node1, OrderNode *node2, BooleanOrder *constr);
+       OrderEdge *getInverseOrderEdge(OrderEdge *edge);
+       Order *getOrder() {return order;}
+       HSIteratorOrderNode *getNodes() {return nodes->iterator();}
+       HSIteratorOrderEdge *getEdges() {return edges->iterator();}
+
+       MEMALLOC;
+private:
        HashSetOrderNode *nodes;
        HashSetOrderEdge *edges;
        Order *order;
 };
 
-OrderGraph *allocOrderGraph(Order *order);
 OrderGraph *buildOrderGraph(Order *order);
 OrderGraph *buildMustOrderGraph(Order *order);
-void addOrderConstraintToOrderGraph(OrderGraph *graph, BooleanOrder *bOrder);
-void addMustOrderConstraintToOrderGraph(OrderGraph *graph, BooleanOrder *bOrder);
-OrderNode *getOrderNodeFromOrderGraph(OrderGraph *graph, uint64_t id);
-OrderEdge *getOrderEdgeFromOrderGraph(OrderGraph *graph, OrderNode *begin, OrderNode *end);
-OrderNode *lookupOrderNodeFromOrderGraph(OrderGraph *graph, uint64_t id);
-OrderEdge *lookupOrderEdgeFromOrderGraph(OrderGraph *graph, OrderNode *begin, OrderNode *end);
-void addOrderEdge(OrderGraph *graph, OrderNode *node1, OrderNode *node2, BooleanOrder *constr);
-void addMustOrderEdge(OrderGraph *graph, OrderNode *node1, OrderNode *node2, BooleanOrder *constr);
-void deleteOrderGraph(OrderGraph *graph);
-OrderEdge *getInverseOrderEdge(OrderGraph *graph, OrderEdge *edge);
 #endif/* ORDERGRAPH_H */
 
index c197a57e71510b56e1ca5c83f7307af0f60e79ce..02f314694d31039468b7e31e60f3f10d33cb3c88 100644 (file)
@@ -1,26 +1,18 @@
 #include "ordernode.h"
 #include "orderedge.h"
 
-OrderNode *allocOrderNode(uint64_t id) {
-       OrderNode *This = (OrderNode *) ourmalloc(sizeof(OrderNode));
-       This->id = id;
-       This->inEdges = new HashSetOrderEdge();
-       This->outEdges = new HashSetOrderEdge();
-       This->status = NOTVISITED;
-       This->sccNum = 0;
-       return This;
+OrderNode::OrderNode(uint64_t _id) :
+       id(_id),
+       status(NOTVISITED),
+       sccNum(0),
+       inEdges(),
+       outEdges() {
 }
 
-void addNewIncomingEdge(OrderNode *node, OrderEdge *edge) {
-       node->inEdges->add(edge);
+void OrderNode::addNewIncomingEdge(OrderEdge *edge) {
+       inEdges.add(edge);
 }
 
-void addNewOutgoingEdge(OrderNode *node, OrderEdge *edge) {
-       node->outEdges->add(edge);
-}
-
-void deleteOrderNode(OrderNode *node) {
-       delete node->inEdges;
-       delete node->outEdges;
-       ourfree(node);
+void OrderNode::addNewOutgoingEdge(OrderEdge *edge) {
+       outEdges.add(edge);
 }
index 4ac6083d31596854db7f3a07aa0139a7adcfeead..36bb3dfcc339f898a9c4bad0074fc52e7374a492 100644 (file)
 enum NodeStatus {NOTVISITED, VISITED, FINISHED, ADDEDTOSET};
 typedef enum NodeStatus NodeStatus;
 
-struct OrderNode {
+class OrderNode {
+public:
+       OrderNode(uint64_t id);
+       void addNewIncomingEdge(OrderEdge *edge);
+       void addNewOutgoingEdge(OrderEdge *edge);
+
        uint64_t id;
-       HashSetOrderEdge * inEdges;
-       HashSetOrderEdge * outEdges;
        NodeStatus status;
        uint sccNum;
+       HashSetOrderEdge inEdges;
+       HashSetOrderEdge outEdges;
+       MEMALLOC;
 };
-
-OrderNode *allocOrderNode(uint64_t id);
-void addNewIncomingEdge(OrderNode *node, OrderEdge *edge);
-void addNewOutgoingEdge(OrderNode *node, OrderEdge *edge);
-void deleteOrderNode(OrderNode *node);
-
 #endif/* ORDERNODE_H */
 
index 3e4f4abd81630ac71ee086adf547bcafbaeedb6d..705f5d9bc8d44b14a2bc3fe50316461cbbdb56e2 100644 (file)
@@ -2,8 +2,8 @@
 #include "csolver.h"
 
 void computePolarities(CSolver *This) {
-       HSIteratorBoolean *iterator=This->constraints.iterator();
-       while(iterator->hasNext()) {
+       HSIteratorBoolean *iterator = This->getConstraints();
+       while (iterator->hasNext()) {
                Boolean *boolean = iterator->next();
                updatePolarity(boolean, P_TRUE);
                updateMustValue(boolean, BV_MUSTBETRUE);
index bada3f0593d94f1d95fd6db8eeff68913236b4d0..0a415b918f53a169f37b32719522f525a831af60 100644 (file)
@@ -9,36 +9,30 @@
 #include "set.h"
 
 
-void orderIntegerEncodingSATEncoder(SATEncoder *This, BooleanOrder *boolOrder){
-       Orderorder = boolOrder->order;
+void orderIntegerEncodingSATEncoder(SATEncoder *This, BooleanOrder *boolOrder) {
+       Order *order = boolOrder->order;
        if (order->elementTable == NULL) {
                order->initializeOrderElementsHashTable();
        }
        //getting two elements and using LT predicate ...
-       ElementSet* elem1 = (ElementSet*)getOrderIntegerElement(This, order, boolOrder->first);
-       ElementSet* elem2 = (ElementSet*)getOrderIntegerElement(This, order, boolOrder->second);
-       Set * sarray[]={elem1->set, elem2->set};
-       Predicate *predicate =new PredicateOperator(LT, sarray, 2);
-       Element * parray[]={elem1, elem2};
-       BooleanPredicate * boolean=new BooleanPredicate(predicate, parray, 2, NULL);
-       {//Adding new elements and boolean/predicate to solver regarding memory management
-               This->solver->allBooleans.push(boolean);
-               This->solver->allPredicates.push(predicate);
-               This->solver->constraints.add(boolean);
-       }
-       replaceBooleanWithBoolean(This->solver, boolOrder, boolean);
+       ElementSet *elem1 = (ElementSet *)getOrderIntegerElement(This, order, boolOrder->first);
+       ElementSet *elem2 = (ElementSet *)getOrderIntegerElement(This, order, boolOrder->second);
+       Set *sarray[] = {elem1->set, elem2->set};
+       Predicate *predicate = This->solver->createPredicateOperator(LT, sarray, 2);
+       Element *parray[] = {elem1, elem2};
+       Boolean *boolean = This->solver->applyPredicate(predicate, parray, 2);
+       This->solver->addConstraint(boolean);
+       This->solver->replaceBooleanWithBoolean(boolOrder, boolean);
 }
 
 
-Element* getOrderIntegerElement(SATEncoder* This,Order *order, uint64_t item) {
-       HashSetOrderElement* eset = order->elementTable;
-       OrderElement oelement ={item, NULL};
-       if( !eset->contains(&oelement)){
-               Set* set = new Set(order->set->type, 1, (uint64_t) order->set->getSize());
-               Element* elem = new ElementSet(set);
-               eset->add(allocOrderElement(item, elem));
-               This->solver->allElements.push(elem);
-               This->solver->allSets.push(set);
+Element *getOrderIntegerElement(SATEncoder *This,Order *order, uint64_t item) {
+       HashSetOrderElement *eset = order->elementTable;
+       OrderElement oelement(item, NULL);
+       if ( !eset->contains(&oelement)) {
+               Set *set = This->solver->createRangeSet(order->set->type, 1, (uint64_t) order->set->getSize());
+               Element *elem = This->solver->getElementVar(set);
+               eset->add(new OrderElement(item, elem));
                return elem;
        } else
                return eset->get(&oelement)->elem;
index 9b5a8084f3df2160d60092e15892b481f16823f9..15fbdd71682ee26037f35be69ec2990889d27256 100644 (file)
@@ -4,7 +4,7 @@
  * and open the template in the editor.
  */
 
-/* 
+/*
  * File:   integerencoding.h
  * Author: hamed
  *
@@ -16,9 +16,9 @@
 #include "classlist.h"
 #include "structs.h"
 
-Element* getOrderIntegerElement(SATEncoder* This,Order *order, uint64_t item);
+Element *getOrderIntegerElement(SATEncoder *This,Order *order, uint64_t item);
 void orderIntegerEncodingSATEncoder(SATEncoder *This, BooleanOrder *boolOrder);
 
 
-#endif /* INTEGERENCODING_H */
+#endif/* INTEGERENCODING_H */
 
index 8b3aa73fef662ad5b5ad5862472e16a97285540b..18602cc864f3c177f925781d057ce760ee9929b8 100644 (file)
 #include "integerencoding.h"
 
 void orderAnalysis(CSolver *This) {
-       uint size = This->allOrders.getSize();
+       Vector<Order *> *orders = This->getOrders();
+       uint size = orders->getSize();
        for (uint i = 0; i < size; i++) {
-               Order *order = This->allOrders.get(i);
-               bool doDecompose=GETVARTUNABLE(This->tuner, order->type, DECOMPOSEORDER, &onoff);
+               Order *order = orders->get(i);
+               bool doDecompose = GETVARTUNABLE(This->getTuner(), order->type, DECOMPOSEORDER, &onoff);
                if (!doDecompose)
                        continue;
-               
+
                OrderGraph *graph = buildOrderGraph(order);
                if (order->type == PARTIAL) {
                        //Required to do SCC analysis for partial order graphs.  It
@@ -30,13 +31,13 @@ void orderAnalysis(CSolver *This) {
                }
 
 
-               bool mustReachGlobal=GETVARTUNABLE(This->tuner, order->type, MUSTREACHGLOBAL, &onoff);
+               bool mustReachGlobal = GETVARTUNABLE(This->getTuner(), order->type, MUSTREACHGLOBAL, &onoff);
 
                if (mustReachGlobal)
                        reachMustAnalysis(This, graph, false);
 
-               bool mustReachLocal=GETVARTUNABLE(This->tuner, order->type, MUSTREACHLOCAL, &onoff);
-               
+               bool mustReachLocal = GETVARTUNABLE(This->getTuner(), order->type, MUSTREACHLOCAL, &onoff);
+
                if (mustReachLocal) {
                        //This pair of analysis is also optional
                        if (order->type == PARTIAL) {
@@ -46,23 +47,26 @@ void orderAnalysis(CSolver *This) {
                        }
                }
 
-               bool mustReachPrune=GETVARTUNABLE(This->tuner, order->type, MUSTREACHPRUNE, &onoff);
-               
+               bool mustReachPrune = GETVARTUNABLE(This->getTuner(), order->type, MUSTREACHPRUNE, &onoff);
+
                if (mustReachPrune)
                        removeMustBeTrueNodes(This, graph);
-               
+
                //This is needed for splitorder
                computeStronglyConnectedComponentGraph(graph);
                decomposeOrder(This, order, graph);
-               deleteOrderGraph(graph);
-               
-               bool doIntegerEncoding = GETVARTUNABLE(This->tuner, order->order.type, ORDERINTEGERENCODING, &onoff );
-               if(!doIntegerEncoding)
-                       continue;
-               uint size = order->constraints.getSize();
-               for(uint i=0; i<size; i++){
-                       orderIntegerEncodingSATEncoder(This->satEncoder, order->constraints.get(i));
-               }
+               delete graph;
+
+               /*
+                  OrderIntegerEncodingSATEncoder wants a private field that it really shoukldn't need...
+
+                  bool doIntegerEncoding = GETVARTUNABLE(This->getTuner(), order->order.type, ORDERINTEGERENCODING, &offon );
+                  if(!doIntegerEncoding)
+                  continue;
+                  uint size = order->constraints.getSize();
+                  for(uint i=0; i<size; i++){
+                  orderIntegerEncodingSATEncoder(This->satEncoder, order->constraints.get(i));
+                  }*/
 
        }
 }
@@ -73,15 +77,15 @@ void decomposeOrder(CSolver *This, Order *order, OrderGraph *graph) {
        uint size = order->constraints.getSize();
        for (uint i = 0; i < size; i++) {
                BooleanOrder *orderconstraint = order->constraints.get(i);
-               OrderNode *from = getOrderNodeFromOrderGraph(graph, orderconstraint->first);
-               OrderNode *to = getOrderNodeFromOrderGraph(graph, orderconstraint->second);
+               OrderNode *from = graph->getOrderNodeFromOrderGraph(orderconstraint->first);
+               OrderNode *to = graph->getOrderNodeFromOrderGraph(orderconstraint->second);
                model_print("from->sccNum:%u\tto->sccNum:%u\n", from->sccNum, to->sccNum);
                if (from->sccNum != to->sccNum) {
-                       OrderEdge *edge = getOrderEdgeFromOrderGraph(graph, from, to);                  
+                       OrderEdge *edge = graph->getOrderEdgeFromOrderGraph(from, to);
                        if (edge->polPos) {
-                               replaceBooleanWithTrue(This, (Boolean *)orderconstraint);
+                               This->replaceBooleanWithTrue(orderconstraint);
                        } else if (edge->polNeg) {
-                               replaceBooleanWithFalse(This, (Boolean *)orderconstraint);
+                               This->replaceBooleanWithFalse(orderconstraint);
                        } else {
                                //This case should only be possible if constraint isn't in AST
                                ASSERT(0);
@@ -92,10 +96,8 @@ void decomposeOrder(CSolver *This, Order *order, OrderGraph *graph) {
                        if (ordervec.getSize() > from->sccNum)
                                neworder = ordervec.get(from->sccNum);
                        if (neworder == NULL) {
-                               MutableSet *set = new MutableSet(order->set->type);
-                               This->allSets.push(set);
-                               neworder = new Order(order->type, set);
-                               This->allOrders.push(neworder);
+                               MutableSet *set = This->createMutableSet(order->set->type);
+                               neworder = This->createOrder(order->type, set);
                                ordervec.setExpand(from->sccNum, neworder);
                                if (order->type == PARTIAL)
                                        partialcandidatevec.setExpand(from->sccNum, neworder);
@@ -111,7 +113,7 @@ void decomposeOrder(CSolver *This, Order *order, OrderGraph *graph) {
                                ((MutableSet *)neworder->set)->addElementMSet(to->id);
                        }
                        if (order->type == PARTIAL) {
-                               OrderEdge *edge = getOrderEdgeFromOrderGraph(graph, from, to);
+                               OrderEdge *edge = graph->getOrderEdgeFromOrderGraph(from, to);
                                if (edge->polNeg)
                                        partialcandidatevec.setExpand(from->sccNum, NULL);
                        }
@@ -120,10 +122,10 @@ void decomposeOrder(CSolver *This, Order *order, OrderGraph *graph) {
                }
        }
 
-       uint pcvsize=partialcandidatevec.getSize();
-       for(uint i=0;i<pcvsize;i++) {
-               Order * neworder=partialcandidatevec.get(i);
-               if (neworder != NULL){
+       uint pcvsize = partialcandidatevec.getSize();
+       for (uint i = 0; i < pcvsize; i++) {
+               Order *neworder = partialcandidatevec.get(i);
+               if (neworder != NULL) {
                        neworder->type = TOTAL;
                        model_print("i=%u\t", i);
                }
index b88fdede56e8491d841f990c61a1d18124ca7c8a..85a54810a2478ca09a14f714563b73978abfbbc7 100644 (file)
@@ -4,7 +4,7 @@
  * and open the template in the editor.
  */
 
-/* 
+/*
  * File:   orderdecompose.h
  * Author: hamed
  *
@@ -19,5 +19,5 @@
 void orderAnalysis(CSolver *This);
 void decomposeOrder(CSolver *This, Order *order, OrderGraph *graph);
 
-#endif /* ORDERDECOMPOSE_H */
+#endif/* ORDERDECOMPOSE_H */
 
index df812dfe682918e3132ff3c2c1c6e71784cbbbd0..1c36cd15d44b32eac6420ea4367febe6aca7820c 100644 (file)
@@ -885,26 +885,26 @@ Edge generateEquivNVConstraint(CNF *cnf, uint numvars, Edge *var1, Edge *var2) {
        return constraintAND(cnf, numvars, array);
 }
 
-Edge generateLTConstraint(CNF *cnf, uint numvars, Edge *var1, Edge *var2){
-       if(numvars == 0 )
+Edge generateLTConstraint(CNF *cnf, uint numvars, Edge *var1, Edge *var2) {
+       if (numvars == 0 )
                return E_False;
-       Edge result =constraintAND2(cnf, constraintNegate( var1[0]), var2[0]);
+       Edge result = constraintAND2(cnf, constraintNegate( var1[0]), var2[0]);
        for (uint i = 1; i < numvars; i++) {
                Edge lt = constraintAND2(cnf, constraintNegate( var1[i]), var2[i]);
-               Edge eq = constraintAND2(cnf, constraintIFF(cnf, var1[i], var2[i]), result); 
-               result = constraintOR2(cnf, lt, eq); 
+               Edge eq = constraintAND2(cnf, constraintIFF(cnf, var1[i], var2[i]), result);
+               result = constraintOR2(cnf, lt, eq);
        }
        return result;
 }
 
-Edge generateLTEConstraint(CNF *cnf, uint numvars, Edge *var1, Edge *var2){
-       if(numvars == 0 )
+Edge generateLTEConstraint(CNF *cnf, uint numvars, Edge *var1, Edge *var2) {
+       if (numvars == 0 )
                return E_True;
-       Edge result =constraintIMPLIES(cnf, var1[0], var2[0]);
+       Edge result = constraintIMPLIES(cnf, var1[0], var2[0]);
        for (uint i = 1; i < numvars; i++) {
                Edge lt = constraintAND2(cnf, constraintNegate( var1[i]), var2[i]);
-               Edge eq = constraintAND2(cnf, constraintIFF(cnf, var1[i], var2[i]), result); 
-               result = constraintOR2(cnf, lt, eq); 
+               Edge eq = constraintAND2(cnf, constraintIFF(cnf, var1[i], var2[i]), result);
+               result = constraintOR2(cnf, lt, eq);
        }
        return result;
 }
index 135501120e20f129dc57f679bce2a6400ca71905..679a656ffe90336313963f75ae0791bf2f795752 100644 (file)
@@ -1,13 +1,7 @@
 #include "orderelement.h"
 
 
-OrderElement *allocOrderElement(uint64_t item, Element* elem) {
-       OrderElement *This = (OrderElement *) ourmalloc(sizeof(OrderElement));
-       This->elem = elem;
-       This->item = item;
-       return This;
-}
-
-void deleteOrderElement(OrderElement *pair) {
-       ourfree(pair);
+OrderElement::OrderElement(uint64_t _item, Element *_elem) {
+       elem = _elem;
+       item = _item;
 }
index 6bdcbc6482a7e2c164ed8bfe4b608cd7f8f7824f..a5f08a3a85f0001c05ba9c9fbebcc694a02c1338 100644 (file)
 #include "mymemory.h"
 #include "constraint.h"
 
-struct OrderElement {
+class OrderElement {
+public:
+       OrderElement(uint64_t item, Element *elem);
        uint64_t item;
-       Element* elem;
+       Element *elem;
+       MEMALLOC;
 };
 
-OrderElement *allocOrderElement(uint64_t item, Element* elem);
-void deleteOrderElement(OrderElement *pair);
 
 #endif/* ORDERELEMENT_H */
 
index b34ea1a324557f7816be269806b8fe2314be79e2..6fc5df1289417ebd321ca15f3479f2486a443713 100644 (file)
 #include "constraint.h"
 
 class OrderPair {
- public:
+public:
        OrderPair(uint64_t first, uint64_t second, Edge constraint);
        OrderPair();
-       uint64_t first;
+       uint64_t first;
        uint64_t second;
        Edge constraint;
        MEMALLOC;
index 0a93045073d30146195362287413d620a2460e60..3dd9933802964758d092a09e34af4cca4cb00433 100644 (file)
@@ -29,13 +29,13 @@ void deleteSATEncoder(SATEncoder *This) {
 }
 
 void encodeAllSATEncoder(CSolver *csolver, SATEncoder *This) {
-       HSIteratorBoolean *iterator=csolver->constraints.iterator();
-       while(iterator->hasNext()) {
+       HSIteratorBoolean *iterator = csolver->getConstraints();
+       while (iterator->hasNext()) {
                Boolean *constraint = iterator->next();
                model_print("Encoding All ...\n\n");
                Edge c = encodeConstraintSATEncoder(This, constraint);
                model_print("Returned Constraint in EncodingAll:\n");
-               ASSERT( ! equalsEdge(c, E_BOGUS));
+               ASSERT( !equalsEdge(c, E_BOGUS));
                addConstraintCNF(This->cnf, c);
        }
        delete iterator;
index 9394899951b4898949e91563ccdeec9354d5568d..695493bb38d583212b44e313690e12794b8fe8e3 100644 (file)
@@ -50,7 +50,7 @@ Edge encodeEnumOperatorPredicateSATEncoder(SATEncoder *This, BooleanPredicate *c
        while (notfinished) {
                Edge carray[numDomains];
 
-               if (predicate->evalPredicateOperator(vals) ^ generateNegation) {
+               if (predicate->evalPredicateOperator(vals) != generateNegation) {
                        //Include this in the set of terms
                        for (uint i = 0; i < numDomains; i++) {
                                Element *elem = constraint->inputs.get(i);
@@ -206,14 +206,14 @@ Edge encodeCircuitOperatorPredicateEncoder(SATEncoder *This, BooleanPredicate *c
        ASSERT(ee0->numVars == ee1->numVars);
        uint numVars = ee0->numVars;
        switch (predicate->op) {
-               case EQUALS:
-                       return generateEquivNVConstraint(This->cnf, numVars, ee0->variables, ee1->variables);
-               case LT:
-                       return generateLTConstraint(This->cnf, numVars, ee0->variables, ee1->variables);
-               case GT:
-                       return generateLTConstraint(This->cnf, numVars, ee1->variables, ee0->variables);
-               default:
-                       ASSERT(0);
+       case EQUALS:
+               return generateEquivNVConstraint(This->cnf, numVars, ee0->variables, ee1->variables);
+       case LT:
+               return generateLTConstraint(This->cnf, numVars, ee0->variables, ee1->variables);
+       case GT:
+               return generateLTConstraint(This->cnf, numVars, ee1->variables, ee0->variables);
+       default:
+               ASSERT(0);
        }
        exit(-1);
 }
index 0efe02c4278e5872aec1a56d83ad2e9596fb8917..27cf8c7664073b749d0fff7d31f440d76266179e 100644 (file)
@@ -16,7 +16,7 @@ Edge encodeEnumEntriesTablePredicateSATEncoder(SATEncoder *This, BooleanPredicat
        ASSERT(undefStatus == IGNOREBEHAVIOR || undefStatus == FLAGFORCEUNDEFINED);
        Table *table = ((PredicateTable *)constraint->predicate)->table;
        FunctionEncodingType encType = constraint->encoding.type;
-       Array<Element*> * inputs = &constraint->inputs;
+       Array<Element *> *inputs = &constraint->inputs;
        uint inputNum = inputs->getSize();
        uint size = table->entries->getSize();
        bool generateNegation = encType == ENUMERATEIMPLICATIONSNEGATE;
index 6ec1f33f3e38c4e2592eb67a82e16c45142e44c9..57447364cfd537b0c999a0845d1772a09a7da886 100644 (file)
 
 Edge encodeOrderSATEncoder(SATEncoder *This, BooleanOrder *constraint) {
        switch ( constraint->order->type) {
-               case PARTIAL:
-                       return encodePartialOrderSATEncoder(This, constraint);
-               case TOTAL:
-                       return encodeTotalOrderSATEncoder(This, constraint);
-               default:
-                       ASSERT(0);
+       case PARTIAL:
+               return encodePartialOrderSATEncoder(This, constraint);
+       case TOTAL:
+               return encodeTotalOrderSATEncoder(This, constraint);
+       default:
+               ASSERT(0);
        }
        return E_BOGUS;
 }
 
-Edge inferOrderConstraintFromGraph(Order* order, uint64_t _first, uint64_t _second){
+Edge inferOrderConstraintFromGraph(Order *order, uint64_t _first, uint64_t _second) {
        if (order->graph != NULL) {
-               OrderGraph *graph=order->graph;
-               OrderNode *first=lookupOrderNodeFromOrderGraph(graph, _first);
-               OrderNode *second=lookupOrderNodeFromOrderGraph(graph, _second);
+               OrderGraph *graph = order->graph;
+               OrderNode *first = graph->lookupOrderNodeFromOrderGraph(_first);
+               OrderNode *second = graph->lookupOrderNodeFromOrderGraph(_second);
                if ((first != NULL) && (second != NULL)) {
-                       OrderEdge *edge=lookupOrderEdgeFromOrderGraph(graph, first, second);
+                       OrderEdge *edge = graph->lookupOrderEdgeFromOrderGraph(first, second);
                        if (edge != NULL) {
                                if (edge->mustPos)
                                        return E_True;
                                else if (edge->mustNeg)
                                        return E_False;
                        }
-                       OrderEdge *invedge=getOrderEdgeFromOrderGraph(graph, second, first);
+                       OrderEdge *invedge = graph->lookupOrderEdgeFromOrderGraph(second, first);
                        if (invedge != NULL) {
                                if (invedge->mustPos)
                                        return E_False;
@@ -52,9 +52,9 @@ Edge inferOrderConstraintFromGraph(Order* order, uint64_t _first, uint64_t _seco
 
 Edge getPairConstraint(SATEncoder *This, Order *order, OrderPair *pair) {
        Edge gvalue = inferOrderConstraintFromGraph(order, pair->first, pair->second);
-       if(!edgeIsNull(gvalue))
+       if (!edgeIsNull(gvalue))
                return gvalue;
-       
+
        HashTableOrderPair *table = order->orderPairTable;
        bool negate = false;
        OrderPair flipped;
@@ -71,7 +71,7 @@ Edge getPairConstraint(SATEncoder *This, Order *order, OrderPair *pair) {
                table->put(paircopy, paircopy);
        } else
                constraint = table->get(pair)->constraint;
-       
+
        return negate ? constraintNegate(constraint) : constraint;
 }
 
@@ -79,7 +79,7 @@ Edge encodeTotalOrderSATEncoder(SATEncoder *This, BooleanOrder *boolOrder) {
        ASSERT(boolOrder->order->type == TOTAL);
        if (boolOrder->order->orderPairTable == NULL) {
                boolOrder->order->initializeOrderHashTable();
-               bool doOptOrderStructure=GETVARTUNABLE(This->solver->tuner, boolOrder->order->type, OPTIMIZEORDERSTRUCTURE, &onoff);
+               bool doOptOrderStructure = GETVARTUNABLE(This->solver->getTuner(), boolOrder->order->type, OPTIMIZEORDERSTRUCTURE, &onoff);
                if (doOptOrderStructure) {
                        boolOrder->order->graph = buildMustOrderGraph(boolOrder->order);
                        reachMustAnalysis(This->solver, boolOrder->order->graph, true);
index 9b143d91833150094dfc8be5d1b4e9f57bf49e7c..ca6b4d4bdc601d3b88a534b689029eb8b9e0d401 100644 (file)
@@ -2,7 +2,7 @@
 #define SATORDERENCODER_H
 
 Edge encodeOrderSATEncoder(SATEncoder *This, BooleanOrder *constraint);
-Edge inferOrderConstraintFromGraph(Orderorder, uint64_t _first, uint64_t _second);
+Edge inferOrderConstraintFromGraph(Order *order, uint64_t _first, uint64_t _second);
 Edge getPairConstraint(SATEncoder *This, Order *order, OrderPair *pair);
 Edge encodeTotalOrderSATEncoder(SATEncoder *This, BooleanOrder *constraint);
 Edge encodePartialOrderSATEncoder(SATEncoder *This, BooleanOrder *constraint);
index 94f6e18cf15d1beab675ed38b0b3407b67d9e281..7b8eae0d8ff16b6b7fc0521aa3af9956eb7dc90a 100644 (file)
@@ -10,11 +10,11 @@ uint64_t getElementValueBinaryIndexSATTranslator(CSolver *This, ElementEncoding
        uint index = 0;
        for (int i = elemEnc->numVars - 1; i >= 0; i--) {
                index = index << 1;
-               if (getValueSolver(This->satEncoder->cnf->solver, getEdgeVar( elemEnc->variables[i] )))
+               if (getValueSolver(This->getSATEncoder()->cnf->solver, getEdgeVar( elemEnc->variables[i] )))
                        index |= 1;
        }
-       model_print("index:%u\tencArraySize:%u\tisInUseElement:%u\n", index, elemEnc->encArraySize, elemEnc->isinUseElement(index));
-       ASSERT(elemEnc->encArraySize > index && elemEnc->isinUseElement(index));
+       if (elemEnc->encArraySize <= index || !elemEnc->isinUseElement(index))
+               model_print("WARNING: Element has undefined value!\n");
        return elemEnc->encodingArray[index];
 }
 
@@ -22,11 +22,11 @@ uint64_t getElementValueBinaryValueSATTranslator(CSolver *This, ElementEncoding
        uint64_t value = 0;
        for (int i = elemEnc->numVars - 1; i >= 0; i--) {
                value = value << 1;
-               if (getValueSolver(This->satEncoder->cnf->solver, getEdgeVar( elemEnc->variables[i] )) )
+               if (getValueSolver(This->getSATEncoder()->cnf->solver, getEdgeVar( elemEnc->variables[i] )) )
                        value |= 1;
        }
        if (elemEnc->isBinaryValSigned &&
-                       This->satEncoder->cnf->solver->solution[ getEdgeVar( elemEnc->variables[elemEnc->numVars - 1])]) {
+                       This->getSATEncoder()->cnf->solver->solution[ getEdgeVar( elemEnc->variables[elemEnc->numVars - 1])]) {
                //Do sign extension of negative number
                uint64_t highbits = 0xffffffffffffffff - ((1 << (elemEnc->numVars)) - 1);
                value += highbits;
@@ -38,7 +38,7 @@ uint64_t getElementValueBinaryValueSATTranslator(CSolver *This, ElementEncoding
 uint64_t getElementValueOneHotSATTranslator(CSolver *This, ElementEncoding *elemEnc) {
        uint index = 0;
        for (uint i = 0; i < elemEnc->numVars; i++) {
-               if (getValueSolver(This->satEncoder->cnf->solver, getEdgeVar( elemEnc->variables[i] )))
+               if (getValueSolver(This->getSATEncoder()->cnf->solver, getEdgeVar( elemEnc->variables[i] )))
                        index = i;
        }
        ASSERT(elemEnc->encArraySize > index && elemEnc->isinUseElement(index));
@@ -48,7 +48,7 @@ uint64_t getElementValueOneHotSATTranslator(CSolver *This, ElementEncoding *elem
 uint64_t getElementValueUnarySATTranslator(CSolver *This, ElementEncoding *elemEnc) {
        uint i;
        for (i = 0; i < elemEnc->numVars; i++) {
-               if (!getValueSolver(This->satEncoder->cnf->solver, getEdgeVar( elemEnc->variables[i] )) ) {
+               if (!getValueSolver(This->getSATEncoder()->cnf->solver, getEdgeVar( elemEnc->variables[i] )) ) {
                        break;
                }
        }
@@ -82,7 +82,7 @@ uint64_t getElementValueSATTranslator(CSolver *This, Element *element) {
 
 bool getBooleanVariableValueSATTranslator( CSolver *This, Boolean *boolean) {
        int index = getEdgeVar( ((BooleanVar *) boolean)->var );
-       return getValueSolver(This->satEncoder->cnf->solver, index);
+       return getValueSolver(This->getSATEncoder()->cnf->solver, index);
 }
 
 HappenedBefore getOrderConstraintValueSATTranslator(CSolver *This, Order *order, uint64_t first, uint64_t second) {
@@ -91,6 +91,6 @@ HappenedBefore getOrderConstraintValueSATTranslator(CSolver *This, Order *order,
        Edge var = getOrderConstraint(order->orderPairTable, &pair);
        if (edgeIsNull(var))
                return UNORDERED;
-       return getValueCNF(This->satEncoder->cnf, var) ? FIRST : SECOND;
+       return getValueCNF(This->getSATEncoder()->cnf, var) ? FIRST : SECOND;
 }
 
index be5c8c0fdfd11082f6f1457b45f206573ef7722d..1d9964fe38755cabb1c845b38d5fbcaf76a04c4f 100644 (file)
@@ -15,7 +15,7 @@
 bool getBooleanVariableValueSATTranslator( CSolver *This, Boolean *boolean);
 HappenedBefore getOrderConstraintValueSATTranslator(CSolver *This, Order *order, uint64_t first, uint64_t second);
 /**
- * most significant bit is represented by variable index 0 
+ * most significant bit is represented by variable index 0
  */
 uint64_t getElementValueBinaryIndexSATTranslator(CSolver *This, ElementEncoding *elemEnc);
 uint64_t getElementValueBinaryValueSATTranslator(CSolver *This, ElementEncoding *elemEnc);
index 6197de71968b351d30d22a732e425e680793e3b1..496bdc65613e0586d2ad7de75bff3c8a7ab05422 100644 (file)
@@ -3,49 +3,49 @@
 
 template<typename type>
 class Array {
- public:
- Array(uint _size) :
-       array((type *)ourcalloc(1, sizeof(type) * _size)),
+public:
      Array(uint _size) :
+               array((type *)ourcalloc(1, sizeof(type) * _size)),
                size(_size)
-               {
-               }
-  
Array(type * _array, uint _size) :
-       array((type *)ourcalloc(1, sizeof(type) * _size)),
+       {
+       }
+
      Array(type *_array, uint _size) :
+               array((type *)ourcalloc(1, sizeof(type) * _size)),
                size(_size) {
-    memcpy(array, _array, _size * sizeof(type));
-  }
-
-  ~Array() {
-    ourfree(array);
-  }
-
-  void remove(uint index) {
-    size--;
-    for (; index < size; index++) {
-      array[index] = array[index + 1];
-    }
-  }
-  
-  type get(uint index) {
-    return array[index];
-  }
-
-  void set(uint index, type item) {
-    array[index] = item;
-  }
-  
-  uint getSize() {
-    return size;
-  }
-
-  type *expose() {
-    return array;
-  }
-
- private:
-  type *array;
-  uint size;
+               memcpy(array, _array, _size * sizeof(type));
+       }
+
+       ~Array() {
+               ourfree(array);
+       }
+
+       void remove(uint index) {
+               size--;
+               for (; index < size; index++) {
+                       array[index] = array[index + 1];
+               }
+       }
+
+       type get(uint index) {
+               return array[index];
+       }
+
+       void set(uint index, type item) {
+               array[index] = item;
+       }
+
+       uint getSize() {
+               return size;
+       }
+
+       type *expose() {
+               return array;
+       }
+
+private:
+       type *array;
+       uint size;
 };
 
 
index a10403ed8dce1c7e4738bfa80d86819889adc2de..377ffe499d201020533b37d9e776ac4a2de30837 100644 (file)
@@ -6,80 +6,80 @@
 
 template<typename type>
 class Vector {
- public:
- Vector(uint _capacity = VECTOR_DEFCAP) :
-       size(0),
+public:
      Vector(uint _capacity = VECTOR_DEFCAP) :
+               size(0),
                capacity(_capacity),
                array((type *) ourmalloc(sizeof(type) * _capacity)) {
-       }                                                                     
+       }
 
Vector(uint _capacity, type * _array) :
-       size(_capacity),
      Vector(uint _capacity, type *_array)  :
+               size(_capacity),
                capacity(_capacity),
                array((type *) ourmalloc(sizeof(type) * _capacity)) {
-               memcpy(array, _array, capacity * sizeof(type));                 
+               memcpy(array, _array, capacity * sizeof(type));
        }
-       
+
        void pop() {
                size--;
-       }                                                                     
+       }
 
        type last() {
-               return array[size - 1];                               
+               return array[size - 1];
        }
-       
-       void setSize(uint _size) {       
-               if (_size <= size) {                                         
-                       size = _size;                                                
-                       return;                                                           
-               } else if (_size > capacity) {                               
-                       array = (type *)ourrealloc(array, _size * sizeof(type)); 
-                       capacity = _size;                                            
-               }                                                                   
-               bzero(&array[size], (_size - size) * sizeof(type)); 
+
+       void setSize(uint _size) {
+               if (_size <= size) {
+                       size = _size;
+                       return;
+               } else if (_size > capacity) {
+                       array = (type *)ourrealloc(array, _size * sizeof(type));
+                       capacity = _size;
+               }
+               bzero(&array[size], (_size - size) * sizeof(type));
                size = _size;
-       }                                                                     
+       }
 
-       void push(type item) {          
-               if (size >= capacity) {                             
-                       uint newcap = capacity << 1;                                
-                       array = (type *)ourrealloc(array, newcap * sizeof(type)); 
-                       capacity = newcap;                                          
-               }                                                                   
-               array[size++] = item;                               
+       void push(type item) {
+               if (size >= capacity) {
+                       uint newcap = capacity << 1;
+                       array = (type *)ourrealloc(array, newcap * sizeof(type));
+                       capacity = newcap;
+               }
+               array[size++] = item;
        }
-       
-       type get(uint index) {         
-               return array[index];                                        
+
+       type get(uint index) {
+               return array[index];
        }
-       
-       void setExpand(uint index, type item) { 
-               if (index >= size)                                            
-                       setSize(index + 1);                         
-               set(index, item);                             
+
+       void setExpand(uint index, type item) {
+               if (index >= size)
+                       setSize(index + 1);
+               set(index, item);
        }
-       
-       void set(uint index, type item) { 
-               array[index] = item;                                          
+
+       void set(uint index, type item) {
+               array[index] = item;
        }
-       
+
        uint getSize() {
-               return size;                                                
+               return size;
        }
-       
+
        ~Vector() {
-               ourfree(array);                                             
+               ourfree(array);
        }
-       
+
        void clear() {
-               size = 0;                                                     
+               size = 0;
        }
-       
+
        type *expose() {
-               return array;                                               
-       }                                                                     
-       
- private:
+               return array;
+       }
+
+private:
        uint size;
        uint capacity;
        type *array;
index b0b987aa2046cd27bc4b3f1aefc4727f56da93ec..6a823f5c58643f142c0397db13141cdae4f9f4f4 100644 (file)
@@ -24,14 +24,14 @@ class HashSet;
 template<typename _Key, typename _KeyInt, int _Shift, unsigned int (*hash_function)(_Key) = default_hash_function<_Key, _Shift, _KeyInt>, bool (*equals)(_Key, _Key) = default_equals<_Key> >
 class HSIterator {
 public:
-       HSIterator(LinkNode<_Key> *_curr, HashSet <_Key, _KeyInt, _Shift, hash_function, equals> * _set) :
+       HSIterator(LinkNode<_Key> *_curr, HashSet <_Key, _KeyInt, _Shift, hash_function, equals> *_set) :
                curr(_curr),
                set(_set)
        {
        }
 
        /** Override: new operator */
-       void * operator new(size_t size) {
+       void *operator new(size_t size) {
                return ourmalloc(size);
        }
 
@@ -41,7 +41,7 @@ public:
        }
 
        /** Override: new[] operator */
-       void * operator new[](size_t size) {
+       void *operator new[](size_t size) {
                return ourmalloc(size);
        }
 
@@ -51,13 +51,13 @@ public:
        }
 
        bool hasNext() {
-               return curr!=NULL;
+               return curr != NULL;
        }
 
        _Key next() {
-               _Key k=curr->key;
-               last=curr;
-               curr=curr->next;
+               _Key k = curr->key;
+               last = curr;
+               curr = curr->next;
                return k;
        }
 
@@ -66,14 +66,14 @@ public:
        }
 
        void remove() {
-               _Key k=last->key;
+               _Key k = last->key;
                set->remove(k);
        }
 
 private:
        LinkNode<_Key> *curr;
        LinkNode<_Key> *last;
-       HashSet <_Key, _KeyInt, _Shift, hash_function, equals> * set;
+       HashSet <_Key, _KeyInt, _Shift, hash_function, equals> *set;
 };
 
 template<typename _Key, typename _KeyInt, int _Shift = 0, unsigned int (*hash_function)(_Key) = default_hash_function<_Key, _Shift, _KeyInt>, bool (*equals)(_Key, _Key) = default_equals<_Key> >
@@ -88,41 +88,41 @@ public:
 
        /** @brief Hashset destructor */
        ~HashSet() {
-               LinkNode<_Key> *tmp=list;
-               while(tmp!=NULL) {
-                       LinkNode<_Key> *tmpnext=tmp->next;
+               LinkNode<_Key> *tmp = list;
+               while (tmp != NULL) {
+                       LinkNode<_Key> *tmpnext = tmp->next;
                        ourfree(tmp);
-                       tmp=tmpnext;
+                       tmp = tmpnext;
                }
                delete table;
        }
 
-       HashSet<_Key, _KeyInt, _Shift, hash_function, equals> * copy() {
-               HashSet<_Key, _KeyInt, _Shift, hash_function, equals> *copy=new HashSet<_Key, _KeyInt, _Shift, hash_function, equals>(table->getCapacity(), table->getLoadFactor());
-               HSIterator<_Key, _KeyInt, _Shift, hash_function, equals> * it=iterator();
-               while(it->hasNext())
+       HashSet<_Key, _KeyInt, _Shift, hash_function, equals> *copy() {
+               HashSet<_Key, _KeyInt, _Shift, hash_function, equals> *copy = new HashSet<_Key, _KeyInt, _Shift, hash_function, equals>(table->getCapacity(), table->getLoadFactor());
+               HSIterator<_Key, _KeyInt, _Shift, hash_function, equals> *it = iterator();
+               while (it->hasNext())
                        copy->add(it->next());
                delete it;
                return copy;
        }
 
        void reset() {
-               LinkNode<_Key> *tmp=list;
-               while(tmp!=NULL) {
-                       LinkNode<_Key> *tmpnext=tmp->next;
+               LinkNode<_Key> *tmp = list;
+               while (tmp != NULL) {
+                       LinkNode<_Key> *tmpnext = tmp->next;
                        ourfree(tmp);
-                       tmp=tmpnext;
+                       tmp = tmpnext;
                }
-               list=tail=NULL;
+               list = tail = NULL;
                table->reset();
        }
 
        /** @brief Adds a new key to the hashset.  Returns false if the key
         *  is already present. */
 
-       void addAll(HashSet<_Key, _KeyInt, _Shift, hash_function, equals> * table) {
-               HSIterator<_Key, _KeyInt, _Shift, hash_function, equals> * it=iterator();
-               while(it->hasNext())
+       void addAll(HashSet<_Key, _KeyInt, _Shift, hash_function, equals> *table) {
+               HSIterator<_Key, _KeyInt, _Shift, hash_function, equals> *it = iterator();
+               while (it->hasNext())
                        add(it->next());
                delete it;
        }
@@ -131,17 +131,17 @@ public:
         *  is already present. */
 
        bool add(_Key key) {
-               LinkNode<_Key> * val=table->get(key);
-               if (val==NULL) {
-                       LinkNode<_Key> * newnode=(LinkNode<_Key> *)ourmalloc(sizeof(struct LinkNode<_Key>));
-                       newnode->prev=tail;
-                       newnode->next=NULL;
-                       newnode->key=key;
-                       if (tail!=NULL)
-                               tail->next=newnode;
+               LinkNode<_Key> *val = table->get(key);
+               if (val == NULL) {
+                       LinkNode<_Key> *newnode = (LinkNode<_Key> *)ourmalloc(sizeof(struct LinkNode<_Key>));
+                       newnode->prev = tail;
+                       newnode->next = NULL;
+                       newnode->key = key;
+                       if (tail != NULL)
+                               tail->next = newnode;
                        else
-                               list=newnode;
-                       tail=newnode;
+                               list = newnode;
+                       tail = newnode;
                        table->put(key, newnode);
                        return true;
                } else
@@ -152,8 +152,8 @@ public:
         *  hashset.  Returns NULL if not present. */
 
        _Key get(_Key key) {
-               LinkNode<_Key> * val=table->get(key);
-               if (val!=NULL)
+               LinkNode<_Key> *val = table->get(key);
+               if (val != NULL)
                        return val->key;
                else
                        return NULL;
@@ -164,26 +164,26 @@ public:
        }
 
        bool contains(_Key key) {
-               return table->get(key)!=NULL;
+               return table->get(key) != NULL;
        }
 
        bool remove(_Key key) {
-               LinkNode<_Key> * oldlinknode;
-               oldlinknode=table->get(key);
-               if (oldlinknode==NULL) {
+               LinkNode<_Key> *oldlinknode;
+               oldlinknode = table->get(key);
+               if (oldlinknode == NULL) {
                        return false;
                }
                table->remove(key);
 
                //remove link node from the list
-               if (oldlinknode->prev==NULL)
-                       list=oldlinknode->next;
+               if (oldlinknode->prev == NULL)
+                       list = oldlinknode->next;
                else
-                       oldlinknode->prev->next=oldlinknode->next;
-               if (oldlinknode->next!=NULL)
-                       oldlinknode->next->prev=oldlinknode->prev;
+                       oldlinknode->prev->next = oldlinknode->next;
+               if (oldlinknode->next != NULL)
+                       oldlinknode->next->prev = oldlinknode->prev;
                else
-                       tail=oldlinknode->prev;
+                       tail = oldlinknode->prev;
                ourfree(oldlinknode);
                return true;
        }
@@ -193,15 +193,15 @@ public:
        }
 
        bool isEmpty() {
-               return getSize()==0;
+               return getSize() == 0;
        }
 
-       HSIterator<_Key, _KeyInt, _Shift, hash_function, equals> * iterator() {
+       HSIterator<_Key, _KeyInt, _Shift, hash_function, equals> *iterator() {
                return new HSIterator<_Key, _KeyInt, _Shift, hash_function, equals>(list, this);
        }
 
        /** Override: new operator */
-       void * operator new(size_t size) {
+       void *operator new(size_t size) {
                return ourmalloc(size);
        }
 
@@ -211,7 +211,7 @@ public:
        }
 
        /** Override: new[] operator */
-       void * operator new[](size_t size) {
+       void *operator new[](size_t size) {
                return ourmalloc(size);
        }
 
@@ -220,7 +220,7 @@ public:
                ourfree(p);
        }
 private:
-       HashTable<_Key, LinkNode<_Key>*, _KeyInt, _Shift, hash_function, equals> * table;
+       HashTable<_Key, LinkNode<_Key> *, _KeyInt, _Shift, hash_function, equals> *table;
        LinkNode<_Key> *list;
        LinkNode<_Key> *tail;
 };
index c33fe60027a3a92f3e0c87de5714c74e2233adce..528f5f2e8239acdbe225ebb31438b3153e11e2e6 100644 (file)
@@ -86,7 +86,7 @@ public:
        }
 
        /** Override: new operator */
-       void * operator new(size_t size) {
+       void *operator new(size_t size) {
                return ourmalloc(size);
        }
 
@@ -96,7 +96,7 @@ public:
        }
 
        /** Override: new[] operator */
-       void * operator new[](size_t size) {
+       void *operator new[](size_t size) {
                return ourmalloc(size);
        }
 
@@ -116,7 +116,7 @@ public:
        }
 
        void resetanddelete() {
-               for(unsigned int i=0;i<capacity;i++) {
+               for (unsigned int i = 0; i < capacity; i++) {
                        struct hashlistnode<_Key, _Val> *bin = &table[i];
                        if (bin->key != NULL) {
                                bin->key = NULL;
@@ -136,7 +136,7 @@ public:
        }
 
        void resetandfree() {
-               for(unsigned int i=0;i<capacity;i++) {
+               for (unsigned int i = 0; i < capacity; i++) {
                        struct hashlistnode<_Key, _Val> *bin = &table[i];
                        if (bin->key != NULL) {
                                bin->key = NULL;
@@ -164,11 +164,11 @@ public:
                /* HashTable cannot handle 0 as a key */
                if (!key) {
                        if (!zero) {
-                               zero=(struct hashlistnode<_Key, _Val> *)ourmalloc(sizeof(struct hashlistnode<_Key, _Val>));
+                               zero = (struct hashlistnode<_Key, _Val> *)ourmalloc(sizeof(struct hashlistnode<_Key, _Val>));
                                size++;
                        }
-                       zero->key=key;
-                       zero->val=val;
+                       zero->key = key;
+                       zero->val = val;
                        return;
                }
 
@@ -214,7 +214,7 @@ public:
                }
 
                unsigned int oindex = hash_function(key) & capacitymask;
-               unsigned int index=oindex;
+               unsigned int index = oindex;
                do {
                        search = &table[index];
                        if (!search->key) {
@@ -225,7 +225,7 @@ public:
                                return search->val;
                        index++;
                        index &= capacitymask;
-                       if (index==oindex)
+                       if (index == oindex)
                                break;
                } while (true);
                return (_Val)0;
@@ -244,9 +244,9 @@ public:
                        if (!zero) {
                                return (_Val)0;
                        } else {
-                               _Val v=zero->val;
+                               _Val v = zero->val;
                                ourfree(zero);
-                               zero=NULL;
+                               zero = NULL;
                                size--;
                                return v;
                        }
@@ -262,10 +262,10 @@ public:
                                        break;
                        } else
                        if (equals(search->key, key)) {
-                               _Val v=search->val;
+                               _Val v = search->val;
                                //empty out this bin
-                               search->val=(_Val) 1;
-                               search->key=0;
+                               search->val = (_Val) 1;
+                               search->key = 0;
                                size--;
                                return v;
                        }
@@ -289,7 +289,7 @@ public:
 
                /* HashTable cannot handle 0 as a key */
                if (!key) {
-                       return zero!=NULL;
+                       return zero != NULL;
                }
 
                unsigned int index = hash_function(key);
@@ -329,7 +329,7 @@ public:
 
                struct hashlistnode<_Key, _Val> *bin = &oldtable[0];
                struct hashlistnode<_Key, _Val> *lastbin = &oldtable[oldcapacity];
-               for (;bin < lastbin;bin++) {
+               for (; bin < lastbin; bin++) {
                        _Key key = bin->key;
 
                        struct hashlistnode<_Key, _Val> *search;
index a6e19f03b22c23b3e30cc2c043903855fa0600ce..7239a7ea4757d87f630ce4f393754606478d789d 100644 (file)
@@ -41,11 +41,11 @@ bool order_edge_equals(OrderEdge *key1, OrderEdge *key2) {
        return key1->sink == key2->sink && key1->source == key2->source;
 }
 
-unsigned int order_element_hash_function(OrderElementThis) {
+unsigned int order_element_hash_function(OrderElement *This) {
        return (uint)This->item;
 }
 
-bool order_element_equals(OrderElement* key1, OrderElement* key2) {
+bool order_element_equals(OrderElement *key1, OrderElement *key2) {
        return key1->item == key2->item;
 }
 
index 4a882fbc3d183161efd0efecdba13dce210dafc7..28d290f0303b9b460ec58fa9a94090ba490c632b 100644 (file)
@@ -12,8 +12,8 @@ unsigned int order_node_hash_function(OrderNode *This);
 bool order_node_equals(OrderNode *key1, OrderNode *key2);
 unsigned int order_edge_hash_function(OrderEdge *This);
 bool order_edge_equals(OrderEdge *key1, OrderEdge *key2);
-unsigned int order_element_hash_function(OrderElementThis);
-bool order_element_equals(OrderElement* key1, OrderElement* key2);
+unsigned int order_element_hash_function(OrderElement *This);
+bool order_element_equals(OrderElement *key1, OrderElement *key2);
 unsigned int order_pair_hash_function(OrderPair *This);
 bool order_pair_equals(OrderPair *key1, OrderPair *key2);
 
index 27ff2488fb16db80f6544f0a3ec9a36a26316685..1d41940fcf4493b039ea2e46d14deb83c9a81455 100644 (file)
@@ -11,7 +11,7 @@ enum ElementEncodingType {
 typedef enum ElementEncodingType ElementEncodingType;
 
 class ElementEncoding {
- public:
+public:
        ElementEncoding(Element *element);
        ElementEncodingType getElementEncodingType() {return type;}
        ~ElementEncoding();
@@ -36,7 +36,7 @@ class ElementEncoding {
                return -1;
        }
 
-       
+
        ElementEncodingType type;
        Element *element;
        Edge *variables;/* List Variables Used To Encode Element */
index 0919a9ea9b90bfe269dafe37ac652019971ae7ef..e4bd5aa4bcec7266a64ac2adc7c6064dc078406e 100644 (file)
@@ -16,7 +16,7 @@ union ElementPredicate {
 typedef union ElementPredicate ElementPredicate;
 
 class FunctionEncoding {
- public:
+public:
        FunctionEncodingType type;
        bool isFunction;//true for function, false for predicate
        ElementPredicate op;
index 826ba8f7bb5ecbb07fd6e141cad1c655043ceeb6..efcb92f4b67f93ff5490aa7e0f61cc1b1d57a8c6 100644 (file)
@@ -14,8 +14,8 @@
 #include <strings.h>
 
 void naiveEncodingDecision(CSolver *This) {
-       HSIteratorBoolean *iterator=This->constraints.iterator();
-       while(iterator->hasNext()) {
+       HSIteratorBoolean *iterator = This->getConstraints();
+       while (iterator->hasNext()) {
                Boolean *boolean = iterator->next();
                naiveEncodingConstraint(boolean);
        }
index 766245ee5b1418e9157ae32ed3d959b6fab7a757..57409e733514a52780de1c32c26b08229a65267a 100644 (file)
@@ -9,7 +9,7 @@ enum OrderEncodingType {
 typedef enum OrderEncodingType OrderEncodingType;
 
 class OrderEncoding {
- public:
+public:
        OrderEncoding(Order *order);
 
        OrderEncodingType type;
index df80fa73a50239a8a83d4fb56916917f68f5dbdd..7e1104dd8fe24870fd39ac8c0889d0e1f4ea6d0c 100644 (file)
@@ -13,16 +13,16 @@ int main(int numargs, char **argv) {
        Boolean *b3 = solver->getBooleanVar(0);
        Boolean *b4 = solver->getBooleanVar(0);
        //L_AND, L_OR, L_NOT, L_XOR, L_IMPLIES
-       Boolean * barray1[]={b1,b2};
+       Boolean *barray1[] = {b1,b2};
        Boolean *andb1b2 = solver->applyLogicalOperation(L_AND, barray1, 2);
-       Boolean * barray2[]={andb1b2, b3};
+       Boolean *barray2[] = {andb1b2, b3};
        Boolean *imply = solver->applyLogicalOperation(L_IMPLIES, barray2, 2);
        solver->addConstraint(imply);
-       Boolean * barray3[] ={b3};
+       Boolean *barray3[] = {b3};
        Boolean *notb3 = solver->applyLogicalOperation(L_NOT, barray3, 1);
-       Boolean * barray4[] ={notb3, b4};
+       Boolean *barray4[] = {notb3, b4};
        solver->addConstraint(solver->applyLogicalOperation(L_OR, barray4, 2));
-       Boolean * barray5[] ={b1, b4};
+       Boolean *barray5[] = {b1, b4};
        solver->addConstraint(solver->applyLogicalOperation(L_XOR, barray5, 2));
        if (solver->startEncoding() == 1)
                printf("b1=%d b2=%d b3=%d b4=%d\n",
index cf3b55739ecd518770290ea7600b114c146d58ed..4828882e67a39002ad8ed16908d7e8e0f31fb37b 100644 (file)
@@ -9,7 +9,7 @@ int main(int numargs, char **argv) {
        CSolver *solver = new CSolver();
        uint64_t set1[] = {5};
        uint64_t set3[] = {1, 3, 4, 6};
-       Set *s1 = solver->createSet(0, set1, 3);
+       Set *s1 = solver->createSet(0, set1, 1);
        Set *s3 = solver->createSet(0, set3, 4);
        Element *e1 = solver->getElementConst(4, 5);
        Element *e2 = solver->getElementVar(s3);
index f9f9c07efcef407b2cbae639a47b29300aa3d8f6..4562176d0bc937a9ac79669f98a16dc0dce5b090 100644 (file)
@@ -17,23 +17,23 @@ int main(int numargs, char **argv) {
        Boolean *o81 =  solver->orderConstraint(order, 8, 1);
 
        /* Not Valid c++...Let Hamed fix...
-       addConstraint(solver, applyLogicalOperation(solver, L_OR,(Boolean *[]) {o12, o13, o24, o34}, 4) );
-       Boolean *b1 = applyLogicalOperation(solver, L_XOR, (Boolean *[]) {o41, o57}, 2);
-       Boolean *o34n = applyLogicalOperation(solver, L_NOT, (Boolean *[]) {o34}, 1);
-       Boolean *o24n = applyLogicalOperation(solver, L_NOT, (Boolean *[]) {o24}, 1);
-       Boolean *b2 = applyLogicalOperation(solver, L_OR, (Boolean *[]) {o34n, o24n}, 2);
-       addConstraint(solver, applyLogicalOperation(solver, L_IMPLIES,(Boolean *[]) {b1, b2}, 2) );
-       addConstraint(solver, applyLogicalOperation(solver, L_AND,(Boolean *[]) {o12, o13}, 2) );
-       addConstraint(solver, applyLogicalOperation(solver, L_OR,(Boolean *[]) {o76, o65}, 2) );
-       Boolean* b3= applyLogicalOperation(solver, L_AND,(Boolean *[]) {o76, o65}, 2) ;
-       Boolean* o57n= applyLogicalOperation(solver, L_NOT,(Boolean *[]) {o57}, 1);
-       addConstraint(solver, applyLogicalOperation(solver, L_IMPLIES,(Boolean *[]) {b3, o57n}, 2) );
-       addConstraint(solver, applyLogicalOperation(solver, L_AND,(Boolean *[]) {o58, o81}, 2) );
-       
-       if (solver->startEncoding() == 1)
-               printf("SAT\n");
-       else
-       printf("UNSAT\n");
-       */
+          addConstraint(solver, applyLogicalOperation(solver, L_OR,(Boolean *[]) {o12, o13, o24, o34}, 4) );
+          Boolean *b1 = applyLogicalOperation(solver, L_XOR, (Boolean *[]) {o41, o57}, 2);
+          Boolean *o34n = applyLogicalOperation(solver, L_NOT, (Boolean *[]) {o34}, 1);
+          Boolean *o24n = applyLogicalOperation(solver, L_NOT, (Boolean *[]) {o24}, 1);
+          Boolean *b2 = applyLogicalOperation(solver, L_OR, (Boolean *[]) {o34n, o24n}, 2);
+          addConstraint(solver, applyLogicalOperation(solver, L_IMPLIES,(Boolean *[]) {b1, b2}, 2) );
+          addConstraint(solver, applyLogicalOperation(solver, L_AND,(Boolean *[]) {o12, o13}, 2) );
+          addConstraint(solver, applyLogicalOperation(solver, L_OR,(Boolean *[]) {o76, o65}, 2) );
+          Boolean* b3= applyLogicalOperation(solver, L_AND,(Boolean *[]) {o76, o65}, 2) ;
+          Boolean* o57n= applyLogicalOperation(solver, L_NOT,(Boolean *[]) {o57}, 1);
+          addConstraint(solver, applyLogicalOperation(solver, L_IMPLIES,(Boolean *[]) {b3, o57n}, 2) );
+          addConstraint(solver, applyLogicalOperation(solver, L_AND,(Boolean *[]) {o58, o81}, 2) );
+
+          if (solver->startEncoding() == 1)
+          printf("SAT\n");
+          else
+          printf("UNSAT\n");
+        */
        delete solver;
 }
index 354b5ef450d62328a77ba0374ea95e8c50140fcf..f0610e4bb28f3d10d8a48509299497f16fb6a12d 100644 (file)
@@ -41,7 +41,7 @@ int main(int numargs, char **argv) {
        solver->addTableEntry(t1, row5, 2, 3);
        solver->addTableEntry(t1, row6, 2, 5);
        Function *f1 = solver->completeTable(t1, FLAGIFFUNDEFINED);
-       Element * tmparray[]={e1, e2};
+       Element *tmparray[] = {e1, e2};
        Element *e3 = solver->applyFunction(f1, tmparray, 2, overflow);
 
        Set *deq[] = {s3,s2};
index 77ae0af42932e26384bdc4e8961a2970ceebe27a..d1e45dedb707670447b05ac0d0dcde1c7c6a32f2 100644 (file)
@@ -42,7 +42,7 @@ int main(int numargs, char **argv) {
        solver->addTableEntry(t1, row6, 3, true);
        Predicate *p1 = solver->createPredicateTable(t1, FLAGIFFUNDEFINED);
        Boolean *undef = solver->getBooleanVar(2);
-       Element * tmparray[] = {e1, e2, e3};
+       Element *tmparray[] = {e1, e2, e3};
        Boolean *b1 = solver->applyPredicateTable(p1, tmparray, 3, undef);
        solver->addConstraint(b1);
 
@@ -54,7 +54,7 @@ int main(int numargs, char **argv) {
 
        Set *d1[] = {s1, s2};
        Predicate *eq = solver->createPredicateOperator(EQUALS, d1, 2);
-       Element * tmparray2[] = {e1, e2};
+       Element *tmparray2[] = {e1, e2};
        Boolean *pred2 = solver->applyPredicate(eq, tmparray2, 2);
        solver->addConstraint(pred2);
 
index e0a3201a9ad024c601de955fe0e8925afe2afc74..5c13a126ac3f9d8d6d9214478d6d2fbd3ff605ab 100644 (file)
@@ -1,16 +1,11 @@
 #include "tunable.h"
 
-Tuner * allocTuner() {
-       return (Tuner *) ourmalloc(sizeof(Tuner));
+Tuner::Tuner() {
 }
 
-void deleteTuner(Tuner *This) {
-       ourfree(This);
-}
-
-int getTunable(Tuner *This, TunableParam param, TunableDesc * descriptor) {
+int Tuner::getTunable(TunableParam param, TunableDesc *descriptor) {
        return descriptor->defaultValue;
 }
-int getVarTunable(Tuner *This, VarType vartype, TunableParam param, TunableDesc * descriptor) {
+int Tuner::getVarTunable(VarType vartype, TunableParam param, TunableDesc *descriptor) {
        return descriptor->defaultValue;
 }
index 24390caf0b0d4558c4dacf95f7cbdf622eeaf70d..6077891a5cff896daa2c990796dd3a74e58da7a6 100644 (file)
@@ -3,26 +3,30 @@
 #include "classlist.h"
 
 
-struct Tuner {
+class Tuner {
+public:
+       Tuner();
+       int getTunable(TunableParam param, TunableDesc *descriptor);
+       int getVarTunable(VarType vartype, TunableParam param, TunableDesc *descriptor);
+       MEMALLOC;
 };
 
-struct TunableDesc {
+class TunableDesc {
+public:
+       TunableDesc(int _lowValue, int _highValue, int _defaultValue) : lowValue(_lowValue), highValue(_highValue), defaultValue(_defaultValue) {}
        int lowValue;
        int highValue;
        int defaultValue;
+       MEMALLOC;
 };
 
-Tuner * allocTuner();
-void deleteTuner(Tuner *This);
 
-int getTunable(Tuner *This, TunableParam param, TunableDesc * descriptor);
-int getVarTunable(Tuner *This, VarType vartype, TunableParam param, TunableDesc * descriptor);
+#define GETTUNABLE(This, param, descriptor) This->getTunable(param, descriptor)
+#define GETVARTUNABLE(This, vartype, param, descriptor) This->getTunable(param, descriptor)
 
-#define GETTUNABLE(This, param, descriptor) getTunable(This, param, descriptor)
-#define GETVARTUNABLE(This, vartype, param, descriptor) getTunable(This, param, descriptor)
+static TunableDesc onoff(0, 1, 1);
+static TunableDesc offon(0, 1, 0);
 
-static TunableDesc onoff={0, 1, 1};
-static TunableDesc offon={0, 1, 0};
 enum Tunables {DECOMPOSEORDER, MUSTREACHGLOBAL, MUSTREACHLOCAL, MUSTREACHPRUNE, OPTIMIZEORDERSTRUCTURE, ORDERINTEGERENCODING};
 typedef enum Tunables Tunables;
 #endif
index 92cc697f4f14c007e1c198337e06c578866f10f4..cef1e1fe6bcc8fd4f46b50f73c71a0a9f945754a 100644 (file)
@@ -42,37 +42,29 @@ class Table;
 class Order;
 class OrderPair;
 
-struct IncrementalSolver;
-typedef struct IncrementalSolver IncrementalSolver;
-
-
-
-struct OrderElement;
-typedef struct OrderElement OrderElement;
+class OrderElement;
 
 class ElementEncoding;
 class FunctionEncoding;
 class OrderEncoding;
 
-struct TableEntry;
-typedef struct TableEntry TableEntry;
+class OrderGraph;
+class OrderNode;
+class OrderEdge;
 
-struct OrderGraph;
-typedef struct OrderGraph OrderGraph;
 
-struct OrderNode;
-typedef struct OrderNode OrderNode;
+struct IncrementalSolver;
+typedef struct IncrementalSolver IncrementalSolver;
 
-struct OrderEdge;
-typedef struct OrderEdge OrderEdge;
+struct TableEntry;
+typedef struct TableEntry TableEntry;
 
 struct OrderEncoder;
 typedef struct OrderEncoder OrderEncoder;
 
-struct Tuner;
-typedef struct Tuner Tuner;
-struct TunableDesc;
-typedef struct TunableDesc TunableDesc;
+class Tuner;
+class TunableDesc;
+
 typedef int TunableParam;
 
 typedef unsigned int uint;
index 64f0851fa74061e507a96569847ab064edda5fd1..d825df5e4c2a8d12192ec1fb5da68fe60eac06cc 100644 (file)
@@ -14,7 +14,7 @@
 #include "orderdecompose.h"
 
 CSolver::CSolver() : unsat(false) {
-       tuner = allocTuner();
+       tuner = new Tuner();
        satEncoder = allocSATEncoder(this);
 }
 
@@ -57,7 +57,7 @@ CSolver::~CSolver() {
        }
 
        deleteSATEncoder(satEncoder);
-       deleteTuner(tuner);
+       delete tuner;
 }
 
 Set *CSolver::createSet(VarType type, uint64_t *elements, uint numelements) {
@@ -161,7 +161,9 @@ Boolean *CSolver::applyPredicateTable(Predicate *predicate, Element **inputs, ui
 }
 
 Boolean *CSolver::applyLogicalOperation(LogicOp op, Boolean **array, uint asize) {
-       return new BooleanLogic(this, op, array, asize);
+       Boolean *boolean = new BooleanLogic(this, op, array, asize);
+       allBooleans.push(boolean);
+       return boolean;
 }
 
 void CSolver::addConstraint(Boolean *constraint) {
index d611e1d894faeab1947668350c710655ba1d3a90..c1fd90b5ebd125b9f429527069149247e84857cb 100644 (file)
@@ -5,48 +5,19 @@
 #include "structs.h"
 
 class CSolver {
- public:
+public:
        CSolver();
        ~CSolver();
-       
-       SATEncoder *satEncoder;
-       bool unsat;
-       Tuner *tuner;
-       
-       /** This is a vector of constraints that must be satisfied. */
-       HashSetBoolean constraints;
-
-       /** This is a vector of all boolean structs that we have allocated. */
-       Vector<Boolean *> allBooleans;
-
-       /** This is a vector of all set structs that we have allocated. */
-       Vector<Set *> allSets;
-
-       /** This is a vector of all element structs that we have allocated. */
-       Vector<Element *> allElements;
-
-       /** This is a vector of all predicate structs that we have allocated. */
-       Vector<Predicate *> allPredicates;
-
-       /** This is a vector of all table structs that we have allocated. */
-       Vector<Table *> allTables;
-
-       /** This is a vector of all order structs that we have allocated. */
-       Vector<Order *> allOrders;
-
-       /** This is a vector of all function structs that we have allocated. */
-       Vector<Function *> allFunctions;
 
        /** This function creates a set containing the elements passed in the array. */
-
        Set *createSet(VarType type, uint64_t *elements, uint num);
 
        /** This function creates a set from lowrange to highrange (inclusive). */
 
        Set *createRangeSet(VarType type, uint64_t lowrange, uint64_t highrange);
-       
+
        /** This function creates a mutable set. */
-       
+
        MutableSet *createMutableSet(VarType type);
 
        /** This function adds a new item to a set. */
@@ -54,9 +25,9 @@ class CSolver {
        void addItem(MutableSet *set, uint64_t element);
 
        /** This function adds a new unique item to the set and returns it.
-                       This function cannot be used in conjunction with manually adding
-                       items to the set. */
-       
+           This function cannot be used in conjunction with manually adding
+           items to the set. */
+
        uint64_t createUniqueItem(MutableSet *set);
 
        /** This function creates an element variable over a set. */
@@ -109,7 +80,7 @@ class CSolver {
        Boolean *applyLogicalOperation(LogicOp op, Boolean **array, uint asize);
 
        /** This function adds a boolean constraint to the set of constraints
-                       to be satisfied */
+           to be satisfied */
 
        void addConstraint(Boolean *constraint);
 
@@ -130,7 +101,58 @@ class CSolver {
 
        HappenedBefore getOrderConstraintValue(Order *order, uint64_t first, uint64_t second);
 
+       void setUnSAT() { unsat = true; }
+
+       bool isUnSAT() { return unsat; }
+
+       Vector<Order *> *getOrders() { return &allOrders;}
+
+       Tuner *getTuner() { return tuner; }
+
+       HSIteratorBoolean *getConstraints() { return constraints.iterator(); }
+
+       SATEncoder *getSATEncoder() {return satEncoder;}
+
+       void replaceBooleanWithTrue(Boolean *bexpr);
+       void replaceBooleanWithFalse(Boolean *bexpr);
+       void replaceBooleanWithBoolean(Boolean *oldb, Boolean *newb);
+
+
        MEMALLOC;
-};
 
+private:
+       void handleXORFalse(BooleanLogic *bexpr, Boolean *child);
+       void handleIMPLIESTrue(BooleanLogic *bexpr, Boolean *child);
+       void handleIMPLIESFalse(BooleanLogic *bexpr, Boolean *child);
+       void handleANDTrue(BooleanLogic *bexpr, Boolean *child);
+       void handleORFalse(BooleanLogic *bexpr, Boolean *child);
+
+       /** This is a vector of constraints that must be satisfied. */
+       HashSetBoolean constraints;
+
+       /** This is a vector of all boolean structs that we have allocated. */
+       Vector<Boolean *> allBooleans;
+
+       /** This is a vector of all set structs that we have allocated. */
+       Vector<Set *> allSets;
+
+       /** This is a vector of all element structs that we have allocated. */
+       Vector<Element *> allElements;
+
+       /** This is a vector of all predicate structs that we have allocated. */
+       Vector<Predicate *> allPredicates;
+
+       /** This is a vector of all table structs that we have allocated. */
+       Vector<Table *> allTables;
+
+       /** This is a vector of all order structs that we have allocated. */
+       Vector<Order *> allOrders;
+
+       /** This is a vector of all function structs that we have allocated. */
+       Vector<Function *> allFunctions;
+
+       SATEncoder *satEncoder;
+       bool unsat;
+       Tuner *tuner;
+};
 #endif
index f5d54d99441969a435c0bb7d81964d4d53a35cfa..294985d98a5deca8f07c884a5ae4e29015fb8e90 100644 (file)
@@ -31,21 +31,21 @@ static inline void ourfree(void *ptr) { free(ptr); }
 static inline void *ourcalloc(size_t count, size_t size) { return calloc(count, size); }
 static inline void *ourrealloc(void *ptr, size_t size) { return realloc(ptr, size); }
 
-#define MEMALLOC                                                                                                        \
-       void * operator new(size_t size) {                       \
-               return ourmalloc(size);                                                          \
-       }                                                                                                                                                                                                        \
-       void operator delete(void *p, size_t size) {                     \
-               ourfree(p);                                                                                                                                                      \
-       }                                                                                                                                                                                                        \
-       void * operator new[](size_t size) {                                                     \
-               return ourmalloc(size);                                                                                                  \
-       }                                                                                                                                                                                                                \
-       void operator delete[](void *p, size_t size) {                   \
-               ourfree(p);                                                                                                                                                              \
-       }                                                                                                                                                                                                                                                                                       \
-       void * operator new(size_t size, void *p) {                             /* placement new */ \
-               return p;                                                                                                                                                                                                                                               \
+#define MEMALLOC                           \
+       void *operator new(size_t size) {       \
+               return ourmalloc(size);                \
+       }                                                  \
+       void operator delete(void *p, size_t size) {       \
+               ourfree(p);                                      \
+       }                                                  \
+       void *operator new[](size_t size) {               \
+               return ourmalloc(size);                          \
+       }                                                    \
+       void operator delete[](void *p, size_t size) {       \
+               ourfree(p);                                        \
+       }                                                                     \
+       void *operator new(size_t size, void *p) {                                                                                                                      /* placement new */ \
+               return p;                                                           \
        }
 
 #endif/* _MY_MEMORY_H */