Merge
[satune.git] / src / csolver.h
index 2875a9c78365e708912ddcd5ef2620837212af66..16396f9b389fb933168fdf1c7740a735a1579218 100644 (file)
@@ -5,6 +5,7 @@
 #include "corestructs.h"
 #include "asthash.h"
 #include "solver_interface.h"
+#include "common.h"
 
 class CSolver {
 public:
@@ -18,6 +19,8 @@ public:
 
        Set *createRangeSet(VarType type, uint64_t lowrange, uint64_t highrange);
 
+       VarType getSetVarType(Set *set);
+
        Element *createRangeVar(VarType type, uint64_t lowrange, uint64_t highrange);
 
        /** This function creates a mutable set. */
@@ -26,6 +29,7 @@ public:
 
        /** This function adds a new item to a set. */
 
+       //Deprecating this unless we need it...
        void addItem(MutableSet *set, uint64_t element);
 
        /** This function adds a new unique item to the set and returns it.
@@ -34,6 +38,11 @@ public:
 
        uint64_t createUniqueItem(MutableSet *set);
 
+       /**
+        * Freeze and finalize the mutableSet ...
+        */
+       void finalizeMutableSet(MutableSet *set);
+
        /** This function creates an element variable over a set. */
 
        Element *getElementVar(Set *set);
@@ -41,6 +50,8 @@ public:
        /** This function creates an element constrant. */
        Element *getElementConst(VarType type, uint64_t value);
 
+       Set *getElementRange (Element *element);
+
        BooleanEdge getBooleanTrue();
 
        BooleanEdge getBooleanFalse();
@@ -120,23 +131,28 @@ public:
        bool isTrue(BooleanEdge b);
        bool isFalse(BooleanEdge b);
 
-       void setUnSAT() { unsat = true; }
-
+       void setUnSAT() { model_print("Setting UNSAT %%%%%%\n"); unsat = true; }
        bool isUnSAT() { return unsat; }
 
+       void printConstraint(BooleanEdge boolean);
+       void printConstraints();
+
        Vector<Order *> *getOrders() { return &allOrders;}
-       HashsetOrder * getActiveOrders() { return &activeOrders;}
+       HashsetOrder *getActiveOrders() { return &activeOrders;}
 
        Tuner *getTuner() { return tuner; }
 
-       SetIteratorBooleanEdge * getConstraints() { return constraints.iterator(); }
+       SetIteratorBooleanEdge *getConstraints() { return constraints.iterator(); }
 
        SATEncoder *getSATEncoder() {return satEncoder;}
 
        void replaceBooleanWithTrue(BooleanEdge bexpr);
+       void replaceBooleanWithTrueNoRemove(BooleanEdge bexpr);
        void replaceBooleanWithFalse(BooleanEdge bexpr);
        void replaceBooleanWithBoolean(BooleanEdge oldb, BooleanEdge newb);
        CSolver *clone();
+       void serialize();
+       static CSolver* deserialize(const char * file);
        void autoTune(uint budget);
 
        void setTuner(Tuner *_tuner) { tuner = _tuner; }
@@ -150,6 +166,10 @@ private:
        void handleIFFTrue(BooleanLogic *bexpr, BooleanEdge child);
        void handleANDTrue(BooleanLogic *bexpr, BooleanEdge child);
 
+       //These two functions are helpers if the client has a pointer to a
+       //Boolean object that we have since replaced
+       BooleanEdge rewriteLogicalOperation(LogicOp op, BooleanEdge *array, uint asize);
+       BooleanEdge doRewrite(BooleanEdge b);
        /** This is a vector of constraints that must be satisfied. */
        HashsetBooleanEdge constraints;
 
@@ -172,7 +192,7 @@ private:
        Vector<Order *> allOrders;
 
        HashsetOrder activeOrders;
-       
+
        /** This is a vector of all function structs that we have allocated. */
        Vector<Function *> allFunctions;