Some SAT stuff, not doing anything special yet, just to keep it in sync.
authorDejan Jovanović <dejan.jovanovic@gmail.com>
Wed, 3 Mar 2010 23:39:43 +0000 (23:39 +0000)
committerDejan Jovanović <dejan.jovanovic@gmail.com>
Wed, 3 Mar 2010 23:39:43 +0000 (23:39 +0000)
src/prop/minisat/Makefile.am
src/prop/minisat/core/Solver.C
src/prop/minisat/core/Solver.h
src/prop/minisat/simp/SimpSolver.C
src/prop/minisat/simp/SimpSolver.h
src/prop/prop_engine.cpp
src/prop/prop_engine.h
src/prop/sat.h
src/smt/smt_engine.cpp

index 9cde8ae2d8616be19487c8e2d811cc62351a4cc6..366cc34c8c565467b07abc6a54ef22b10e17a073 100644 (file)
@@ -1,6 +1,6 @@
 AM_CPPFLAGS = \
        -D__BUILDING_CVC4LIB \
-       -I@srcdir@/mtl -I@srcdir@/core -I@srcdir@/../../include
+       -I@srcdir@/mtl -I@srcdir@/core -I@srcdir@/../.. -I@srcdir@/../../include
 AM_CXXFLAGS = -Wall -fvisibility=hidden -DNDEBUG
 
 noinst_LTLIBRARIES = libminisat.la
index e99870654ad9147e72422c73a3016af2da1925c3..771d79f62a30eb78bb6932c76f0a466c33a24f4a 100644 (file)
@@ -19,6 +19,7 @@ OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWA
 
 #include "Solver.h"
 #include "Sort.h"
+#include "prop/sat.h"
 #include <cmath>
 
 //=================================================================================================
@@ -28,10 +29,14 @@ namespace CVC4 {
 namespace prop {
 namespace minisat {
 
-Solver::Solver() :
+Solver::Solver(SatSolver* proxy, context::Context* context) :
+
+    // SMT stuff
+    proxy(proxy)
+  , context(context)
 
     // Parameters: (formerly in 'SearchParams')
-    var_decay(1 / 0.95), clause_decay(1 / 0.999), random_var_freq(0.02)
+  , var_decay(1 / 0.95), clause_decay(1 / 0.999), random_var_freq(0.02)
   , restart_first(100), restart_inc(1.5), learntsize_factor((double)1/(double)3), learntsize_inc(1.1)
 
     // More parameters:
@@ -159,14 +164,20 @@ bool Solver::satisfied(const Clause& c) const {
 //
 void Solver::cancelUntil(int level) {
     if (decisionLevel() > level){
-        for (int c = trail.size()-1; c >= trail_lim[level]; c--){
+        // Pop the SMT context
+        for (int l = trail_lim.size() - level; l > 0; --l)
+          context->pop();
+        // Now the minisat stuff
+        for (int c = trail.size()-1; c >= trail_lim[level]; c--) {
             Var     x  = var(trail[c]);
             assigns[x] = toInt(l_Undef);
-            insertVarOrder(x); }
+            insertVarOrder(x);
+        }
         qhead = trail_lim[level];
         trail.shrink(trail.size() - trail_lim[level]);
         trail_lim.shrink(trail_lim.size() - level);
-    } }
+    }
+}
 
 
 //=================================================================================================
@@ -390,9 +401,40 @@ void Solver::uncheckedEnqueue(Lit p, Clause* from)
 }
 
 
+Clause* Solver::propagate()
+{
+    Clause* confl = NULL;
+
+    while(qhead < trail.size()) {
+      confl = propagateBool();
+      if (confl != NULL) break;
+      confl = propagateTheory();
+      if (confl != NULL) break;
+    }
+
+    return confl;
+}
+
 /*_________________________________________________________________________________________________
 |
-|  propagate : [void]  ->  [Clause*]
+|  propagateTheory : [void]  ->  [Clause*]
+|
+|  Description:
+|    Propagates all enqueued theory facts. If a conflict arises, the conflicting clause is returned,
+|    otherwise NULL.
+|
+|    Note: the propagation queue might be NOT empty
+|________________________________________________________________________________________________@*/
+Clause* Solver::propagateTheory()
+{
+  SatClause clause;
+  proxy->theoryCheck(clause);
+  return NULL;
+}
+
+/*_________________________________________________________________________________________________
+|
+|  propagateBool : [void]  ->  [Clause*]
 |  
 |  Description:
 |    Propagates all enqueued facts. If a conflict arises, the conflicting clause is returned,
@@ -401,7 +443,7 @@ void Solver::uncheckedEnqueue(Lit p, Clause* from)
 |    Post-conditions:
 |      * the propagation queue is empty, even if there was a conflict.
 |________________________________________________________________________________________________@*/
-Clause* Solver::propagate()
+Clause* Solver::propagateBool()
 {
     Clause* confl     = NULL;
     int     num_props = 0;
index 44499246e8d24bc303b61a15e550a98ccebe6b21..c593d8b2cbca8c87912f58ec17e30a34928b2ba3 100644 (file)
@@ -17,11 +17,12 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 **************************************************************************************************/
 
-#include "cvc4_private.h"
-
 #ifndef __CVC4__PROP__MINISAT__SOLVER_H
 #define __CVC4__PROP__MINISAT__SOLVER_H
 
+#include "cvc4_private.h"
+#include "context/context.h"
+
 #include <cstdio>
 #include <cassert>
 
@@ -32,27 +33,34 @@ OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWA
 
 #include "SolverTypes.h"
 
-
 //=================================================================================================
 // Solver -- the main class:
 
 namespace CVC4 {
 namespace prop {
 
-class SatSolverProxy;
+class SatSolver;
 
 namespace minisat {
 
 class Solver {
 
   /** The only CVC4 entry point to the private solver data */
-  friend class CVC4::prop::SatSolverProxy;
+  friend class CVC4::prop::SatSolver;
+
+protected:
+
+  /** The pointer to the proxy that provides interfaces to the SMT engine */
+  SatSolver* proxy;
+
+  /** The context from the SMT solver */
+  context::Context* context;
 
 public:
 
     // Constructor/Destructor:
     //
-    Solver();
+    Solver(SatSolver* proxy, context::Context* context);
     CVC4_PUBLIC ~Solver();
 
     // Problem specification:
@@ -165,7 +173,9 @@ protected:
     void     newDecisionLevel ();                                                      // Begins a new decision level.
     void     uncheckedEnqueue (Lit p, Clause* from = NULL);                            // Enqueue a literal. Assumes value of literal is undefined.
     bool     enqueue          (Lit p, Clause* from = NULL);                            // Test if fact 'p' contradicts current state, enqueue otherwise.
-    Clause*  propagate        ();                                                      // Perform unit propagation. Returns possibly conflicting clause.
+    Clause*  propagate        ();                                                      // Perform Boolean and Theory. Returns possibly conflicting clause.
+    Clause*  propagateBool    ();                                                      // Perform Boolean propagation. Returns possibly conflicting clause.
+    Clause*  propagateTheory  ();                                                      // Perform Theory propagation. Returns possibly conflicting clause.
     void     cancelUntil      (int level);                                             // Backtrack until a certain level.
     void     analyze          (Clause* confl, vec<Lit>& out_learnt, int& out_btlevel); // (bt = backtrack)
     void     analyzeFinal     (Lit p, vec<Lit>& out_conflict);                         // COULD THIS BE IMPLEMENTED BY THE ORDINARIY "analyze" BY SOME REASONABLE GENERALIZATION?
@@ -217,11 +227,9 @@ protected:
         return (int)(drand(seed) * size); }
 };
 
-
 //=================================================================================================
 // Implementation of inline methods:
 
-
 inline void Solver::insertVarOrder(Var x) {
     if (!order_heap.inHeap(x) && decision_var[x]) order_heap.insert(x); }
 
@@ -247,7 +255,7 @@ inline void Solver::claBumpActivity (Clause& c) {
 
 inline bool     Solver::enqueue         (Lit p, Clause* from)   { return value(p) != l_Undef ? value(p) != l_False : (uncheckedEnqueue(p, from), true); }
 inline bool     Solver::locked          (const Clause& c) const { return reason[var(c[0])] == &c && value(c[0]) == l_True; }
-inline void     Solver::newDecisionLevel()                      { trail_lim.push(trail.size()); }
+inline void     Solver::newDecisionLevel()                      { trail_lim.push(trail.size()); context->push(); }
 
 inline int      Solver::decisionLevel ()      const   { return trail_lim.size(); }
 inline uint32_t Solver::abstractLevel (Var x) const   { return 1 << (level[x] & 31); }
index 063332e74d1ea15a1179c4b496897ae072d41208..124849155763cd51971e45c787550a7612840bd8 100644 (file)
@@ -28,8 +28,9 @@ namespace CVC4 {
 namespace prop {
 namespace minisat {
 
-SimpSolver::SimpSolver() :
-    grow               (0)
+SimpSolver::SimpSolver(SatSolver* proxy, context::Context* context) :
+    Solver(proxy, context)
+  , grow               (0)
   , asymm_mode         (false)
   , redundancy_check   (false)
   , merges             (0)
index 223b21998f0957e8333919bf6140d83a0014cdc8..67d0d2b952185163a7637ab9a6df7673290635be 100644 (file)
@@ -30,13 +30,16 @@ OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWA
 
 namespace CVC4 {
 namespace prop {
+
+class SatSolver;
+
 namespace minisat {
 
 class SimpSolver : public Solver {
  public:
     // Constructor/Destructor:
     //
-    SimpSolver();
+    SimpSolver(SatSolver* proxy, context::Context* context);
     CVC4_PUBLIC ~SimpSolver();
 
     // Problem specification:
index 76be5d6d8b1c2a58a062963d28504cf40b1ee0a9..32be206b07a3c3dbfa9000d19ffcf85ec9c2cc00 100644 (file)
 #include <map>
 
 using namespace std;
+using namespace CVC4::context;
 
 namespace CVC4 {
 namespace prop {
 
 PropEngine::PropEngine(const Options* opts, DecisionEngine* de,
-                       TheoryEngine* te)
+                       TheoryEngine* te, Context* context)
 : d_inCheckSat(false),
   d_options(opts),
   d_decisionEngine(de),
-  d_theoryEngine(te) 
+  d_theoryEngine(te),
+  d_context(context)
 {
   Debug("prop") << "Constructing the PropEngine" << endl;
-  d_satSolver = new SatSolver();
-  SatSolverProxy::initSatSolver(d_satSolver, d_options);
+  d_satSolver = new SatSolver(this, d_theoryEngine, d_context, d_options);
   d_cnfStream = new CVC4::prop::TseitinCnfStream(d_satSolver);
 }
 
index f57161fde4b66bff1871acc22c722096f1a4c89b..0c3916162483b9275c851c8841dfef08d9bb1432 100644 (file)
@@ -53,7 +53,9 @@ class PropEngine {
   /** The theory engine we will be using */
   TheoryEngine *d_theoryEngine;
 
-  /** The SAT solver*/
+  context::Context* d_context;
+
+  /** The SAT solver proxy */
   SatSolver* d_satSolver;
 
   /** List of all of the assertions that need to be made */
@@ -67,7 +69,7 @@ public:
   /**
    * Create a PropEngine with a particular decision and theory engine.
    */
-  PropEngine(const Options*, DecisionEngine*, TheoryEngine*);
+  PropEngine(const Options*, DecisionEngine*, TheoryEngine*, context::Context*);
 
   /**
    * Destructor.
index 65752f20b44bd6e3eff462f782f09975647af653..1cd5d0bfe0f43d7f6794f4f8b9fd8b9d17f1db2b 100644 (file)
@@ -14,6 +14,8 @@
  **/
 
 #include "cvc4_private.h"
+#include "context/context.h"
+#include "theory/theory_engine.h"
 
 #ifndef __CVC4__PROP__SAT_H
 #define __CVC4__PROP__SAT_H
 #include "prop/minisat/simp/SimpSolver.h"
 
 namespace CVC4 {
+
+class TheoryEngine;
+
 namespace prop {
 
-/** The solver we are using */
-typedef minisat::SimpSolver SatSolver;
+class PropEngine;
 
 /** Type of the SAT variables */
 typedef minisat::Var SatVariable;
@@ -74,24 +78,56 @@ inline std::ostream& operator << (std::ostream& out, const SatClause& clause) {
  * It's only accessible from the PropEngine, and should be treated with major
  * care.
  */
-class SatSolverProxy {
+class SatSolver {
+
+  /** The prop engine we are using */
+  PropEngine* d_propEngine;
+
+  /** The theory engine we are using */
+  TheoryEngine* d_theoryEngine;
 
-  /** Only the prop engine can modify the internals of the SAT solver */
-  friend class PropEngine;
+  /** Context we will be using to synchronzie the sat solver */
+  context::Context* d_context;
 
-  private:
+  /** Minisat solver */
+  minisat::SimpSolver* d_minisat;
 
-    /**
-     * Initializes the given sat solver with the given options.
-     * @param satSolver the SAT solver
-     * @param options the options
-     */
-    inline static void initSatSolver(SatSolver* satSolver,
-                                     const Options* options) {
+  /** Remember the options */
+  Options* d_options;
+
+  public:
+
+    SatSolver(PropEngine* propEngine, TheoryEngine* theoryEngine,
+                   context::Context* context, const Options* options)
+      : d_propEngine(propEngine),
+        d_theoryEngine(theoryEngine),
+        d_context(context)
+    {
+      // Create the solver
+      d_minisat = new minisat::SimpSolver(this, d_context);
       // Setup the verbosity
-      satSolver->verbosity = (options->verbosity > 0) ? 1 : -1;
+      d_minisat->verbosity = (options->verbosity > 0) ? 1 : -1;
       // Do not delete the satisfied clauses, just the learnt ones
-      satSolver->remove_satisfied = false;
+      d_minisat->remove_satisfied = false;
+    }
+
+    ~SatSolver() {
+      delete d_minisat;
+    }
+
+    inline bool solve() {
+      return d_minisat->solve();
+    }
+
+    inline void addClause(SatClause& clause) {
+      d_minisat->addClause(clause);
+    }
+
+    inline SatVariable newVar() {
+      return d_minisat->newVar();
+    }
+
+    inline void theoryCheck(SatClause& conflict) {
     }
 };
 
index ae676e48d4807e9a0f6dfa45b8c64235d016b5ab..c45314a556354f89a2bfbec9e8a11d94cfe7f94e 100644 (file)
@@ -33,7 +33,7 @@ SmtEngine::SmtEngine(ExprManager* em, const Options* opts) throw () :
   NodeManagerScope nms(d_nodeManager);
   d_decisionEngine = new DecisionEngine;
   d_theoryEngine = new TheoryEngine(this, d_ctxt);
-  d_propEngine = new PropEngine(opts, d_decisionEngine, d_theoryEngine);
+  d_propEngine = new PropEngine(opts, d_decisionEngine, d_theoryEngine, d_ctxt);
 }
 
 SmtEngine::~SmtEngine() {