]> git.unchartedbackwaters.co.uk Git - francis/stp.git/commitdiff
Importing new version of CMS2
authormsoos <msoos@e59a4935-1847-0410-ae03-e826735625c1>
Fri, 16 Apr 2010 15:54:30 +0000 (15:54 +0000)
committermsoos <msoos@e59a4935-1847-0410-ae03-e826735625c1>
Fri, 16 Apr 2010 15:54:30 +0000 (15:54 +0000)
* bug with Conglomerate fixed. Conglomerate will in the future be
  callable in the middle of solving
* variable activity is now uint32_t. No more floating point code.
  This change also means a more conservative variable activity
  heuristic. Should help on most problems (but not crypto, I
  believe)
* Removed useless code around logging
* No more warnings on (deprecated) const char* to string conversion

git-svn-id: https://stp-fast-prover.svn.sourceforge.net/svnroot/stp-fast-prover/trunk/stp@687 e59a4935-1847-0410-ae03-e826735625c1

src/sat/cryptominisat2/Conglomerate.cpp
src/sat/cryptominisat2/Conglomerate.h
src/sat/cryptominisat2/FailedVarSearcher.cpp
src/sat/cryptominisat2/PartHandler.cpp
src/sat/cryptominisat2/Solver.cpp
src/sat/cryptominisat2/Solver.h
src/sat/cryptominisat2/Subsumer.cpp
src/sat/cryptominisat2/VERSION
src/sat/cryptominisat2/VarReplacer.cpp

index 43caf21f3950c3fa25929632e63b38c148cc5da6..683f5581b34e7cbf840db3e559ac59630618ac6d 100644 (file)
@@ -92,10 +92,13 @@ void Conglomerate::fillVarToXor()
 
 void Conglomerate::removeVar(const Var var)
 {
-    solver.setDecisionVar(var, false);
     solver.activity[var] = 0.0;
     solver.order_heap.update(var);
     removedVars[var] = true;
+    if (solver.decision_var[var]) {
+        madeVarNonDecision.push(var);
+        solver.setDecisionVar(var, false);
+    }
     found++;
 }
 
@@ -461,52 +464,24 @@ void Conglomerate::clearLearntsFromToRemove()
     solver.learnts.shrink(r-a);
 }
 
-void Conglomerate::doCalcAtFinish()
+void Conglomerate::extendModel(Solver& solver2)
 {
     #ifdef VERBOSE_DEBUG
     cout << "Executing doCalcAtFinish" << endl;
     #endif
     
-    vector<Var> toAssign;
-    for (XorClause** it = calcAtFinish.getData() + calcAtFinish.size()-1; it != calcAtFinish.getData()-1; it--) {
-        toAssign.clear();
-        XorClause& c = **it;
+    vec<Lit> ps;
+    for (int i = (int)(calcAtFinish.size())-1; i >= 0; i--) {
+        XorClause& c = *calcAtFinish[i];
         assert(c.size() > 2);
         
-        #ifdef VERBOSE_DEBUG
-        cout << "doCalcFinish for xor-clause:";
-        c.plainPrint();
-        #endif
-        
-        bool final = c.xor_clause_inverted();
-        for (int k = 0, size = c.size(); k < size; k++ ) {
-            const lbool& val = solver.assigns[c[k].var()];
-            if (val == l_Undef)
-                toAssign.push_back(c[k].var());
-            else
-                final ^= val.getBool();
-        }
-        #ifdef VERBOSE_DEBUG
-        if (toAssign.size() == 0) {
-            cout << "ERROR: toAssign.size() == 0 !!" << endl;
-            for (int k = 0, size = c.size(); k < size; k++ ) {
-                cout << "Var: " << c[k].var() + 1 << " Level: " << solver.level[c[k].var()] << endl;
-            }
-        }
-        if (toAssign.size() > 1) {
-            cout << "Double assign!" << endl;
-            for (uint i = 1; i < toAssign.size(); i++) {
-                cout << "-> extra Var " << toAssign[i]+1 << endl;
-            }
+        ps.clear();
+        for (Lit *l = c.getData(), *end = c.getDataEnd(); l != end; l++) {
+            ps.push(l->unsign());
         }
-        #endif
-        assert(toAssign.size() > 0);
         
-        for (uint i = 1; i < toAssign.size(); i++) {
-            solver.uncheckedEnqueue(Lit(toAssign[i], true), &c);
-        }
-        solver.uncheckedEnqueue(Lit(toAssign[0], final), &c);
-        assert(solver.clauseCleaner->satisfied(c));
+        solver2.addXorClause(ps, c.xor_clause_inverted(), c.getGroup());
+        assert(solver2.ok);
     }
 }
 
@@ -516,9 +491,6 @@ const bool Conglomerate::addRemovedClauses()
     cout << "Executing addRemovedClauses" << endl;
     #endif
     
-    char tmp[100];
-    tmp[0] = '\0';
-    vec<Lit> ps;
     for(uint i = 0; i < calcAtFinish.size(); i++)
     {
         XorClause& c = *calcAtFinish[i];
@@ -527,31 +499,22 @@ const bool Conglomerate::addRemovedClauses()
         c.plainPrint();
         #endif
         
-        ps.clear();
-        for(uint i2 = 0; i2 != c.size() ; i2++) {
-            ps.push(Lit(c[i2].var(), false));
-        }
-        if (!solver.addXorClause(ps, c.xor_clause_inverted(), c.getGroup(), tmp))
+        for(Lit *l = c.getData(), *end = c.getDataEnd(); l != end ; l++)
+            *l = l->unsign();
+        
+        if (!solver.addXorClause(c, c.xor_clause_inverted(), c.getGroup()))
             return false;
         free(&c);
     }
     calcAtFinish.clear();
-    for (uint i = 0; i < removedVars.size(); i++) {
-        if (removedVars[i]) {
-            removedVars[i] = false;
-            solver.setDecisionVar(i, true);
-            #ifdef VERBOSE_DEBUG
-            std::cout << "Inserting Var " << i+1 << " back into the order_heap" << std::endl;
-            #endif //VERBOSE_DEBUG
-        }
+    
+    std::fill(removedVars.getData(), removedVars.getDataEnd(), false);
+    for (Var *v = madeVarNonDecision.getData(), *end =  madeVarNonDecision.getDataEnd(); v != end; v++) {
+        solver.setDecisionVar(*v, true);
     }
+    madeVarNonDecision.clear();
     
     return true;
 }
 
-void Conglomerate::newVar()
-{
-    removedVars.resize(removedVars.size()+1, false);
-}
-
 }; //NAMESPACE MINISAT
index 15fcb0bbb3f72c5ad5c54a2a22e3dd26220d59e3..50972d464739a81ad2ae0870a68f076f425cce0b 100644 (file)
@@ -50,11 +50,12 @@ public:
     const bool conglomerateXorsFull();
     const bool heuleProcessFull();
     const bool addRemovedClauses(); ///<Add clauses that have been removed. Used if solve() is called multiple times
-    void doCalcAtFinish(); ///<Calculate variables removed during conglomeration
+    void extendModel(Solver& solver2); ///<Calculate variables removed during conglomeration
     
     const vec<XorClause*>& getCalcAtFinish() const;
     vec<XorClause*>& getCalcAtFinish();
-    const vector<bool>& getRemovedVars() const;
+    const vec<bool>& getRemovedVars() const;
+    const bool needCalcAtFinish() const;
     
     void newVar();
     
@@ -84,7 +85,9 @@ private:
     varToXorMap varToXor; 
     vector<bool> blocked;
     vector<bool> toRemove;
-    vector<bool> removedVars;
+    
+    vec<bool> removedVars;
+    vec<Var> madeVarNonDecision;
     
     vec<XorClause*> calcAtFinish;
     uint found;
@@ -92,7 +95,12 @@ private:
     Solver& solver;
 };
 
-inline const vector<bool>& Conglomerate::getRemovedVars() const
+inline void Conglomerate::newVar()
+{
+    removedVars.push(false);
+}
+
+inline const vec<bool>& Conglomerate::getRemovedVars() const
 {
     return removedVars;
 }
@@ -107,6 +115,11 @@ inline vec<XorClause*>& Conglomerate::getCalcAtFinish()
     return calcAtFinish;
 }
 
+inline const bool Conglomerate::needCalcAtFinish() const
+{
+    return calcAtFinish.size();
+}
+
 }; //NAMESPACE MINISAT
 
 #endif //CONGLOMERATE_H
index 227875ee068a55c425b750484d58354408fa9243..f2de3da00f7c9f31c8f43fca109ba0c7a31f266f 100644 (file)
@@ -125,10 +125,9 @@ const bool FailedVarSearcher::search(uint64_t numProps)
     //Saving Solver state
     Heap<Solver::VarOrderLt> backup_order_heap(solver.order_heap);
     vector<bool> backup_polarities = solver.polarity;
-    vec<double> backup_activity;
-    backup_activity.growTo(solver.activity.size());
+    vec<uint32_t> backup_activity(solver.activity.size());
     std::copy(solver.activity.getData(), solver.activity.getDataEnd(), backup_activity.getData());
-    double backup_var_inc = solver.var_inc;
+    uint32_t backup_var_inc = solver.var_inc;
     uint32_t origHeapSize = solver.order_heap.size();
     
     //General Stats
index dddc7ff8cd2cfad50b12257f986028472ca39e71..c7f666ace59e16279c2756cf843953cd244992a3 100644 (file)
@@ -64,7 +64,6 @@ const bool PartHandler::handle()
         Solver newSolver;
         newSolver.mtrand.seed(solver.mtrand.randInt());
         newSolver.random_var_freq = solver.random_var_freq;
-        newSolver.var_decay = solver.var_decay;
         newSolver.verbosity = solver.verbosity;
         newSolver.restrictedPickBranch = solver.restrictedPickBranch;
         newSolver.greedyUnbound = solver.greedyUnbound;
index 552b2a8147a7b65f9f1ae70c79a1d743595cc78b..e98bab43e19756b08d63fbec7d73720fba0bb194 100644 (file)
@@ -61,7 +61,7 @@ using namespace MINISAT;
 
 Solver::Solver() :
         // Parameters: (formerly in 'SearchParams')
-        var_decay(1 / 0.95), random_var_freq(0.02)
+        random_var_freq(0.02)
         , restart_first(100), restart_inc(1.5), learntsize_factor((double)1/(double)3), learntsize_inc(1)
 
         // More parameters:
@@ -98,7 +98,7 @@ Solver::Solver() :
         
 
         , ok               (true)
-        , var_inc          (1)
+        , var_inc          (128)
         
         , curRestart       (1)
         , nbclausesbeforereduce (NBCLAUSESBEFOREREDUCE)
@@ -203,6 +203,10 @@ Var Solver::newVar(bool dvar)
 template<class T>
 XorClause* Solver::addXorClauseInt(T& ps, bool xor_clause_inverted, const uint32_t group)
 {
+    if (ps.size() > (0x01UL << 18)) {
+        std::cout << "Too long clause!" << std::endl;
+        exit(-1);
+    }
     std::sort(ps.getData(), ps.getData()+ps.size());
     Lit p;
     uint32_t i, j;
@@ -1755,11 +1759,10 @@ const lbool Solver::simplifyProblem(const uint32_t numConfls, const uint64_t num
     Heap<VarOrderLt> backup_order_heap(order_heap);
     vector<bool> backup_polarities = polarity;
     RestartType backup_restartType= restartType;
-    double backup_random_var_freq = random_var_freq;
-    vec<double> backup_activity;
-    backup_activity.growTo(activity.size());
+    uint32_t backup_random_var_freq = random_var_freq;
+    vec<uint32_t> backup_activity(activity.size());
     std::copy(activity.getData(), activity.getDataEnd(), backup_activity.getData());
-    double backup_var_inc = var_inc;
+    uint32_t backup_var_inc = var_inc;
     
     if (verbosity >= 2)
         std::cout << "c | " << std::setw(24) << " " 
@@ -2015,7 +2018,7 @@ lbool Solver::solve(const vec<Lit>& assumps)
         //checkSolution();
 #endif
         
-        if (subsumer->getNumElimed() > 0) {
+        if (subsumer->getNumElimed() > 0 || conglomerate->needCalcAtFinish()) {
             Solver s;
             s.doSubsumption = false;
             s.performReplace = false;
@@ -2025,8 +2028,10 @@ lbool Solver::solve(const vec<Lit>& assumps)
             s.conglomerateXors = false;
             s.greedyUnbound = greedyUnbound;
             for (Var var = 0; var < nVars(); var++) {
-                s.newVar(decision_var[var] || subsumer->getVarElimed()[var] || varReplacer->varHasBeenReplaced(var));
+                s.newVar(decision_var[var] || subsumer->getVarElimed()[var] || varReplacer->varHasBeenReplaced(var) || conglomerate->getRemovedVars()[var]);
+                
                 assert(!(conglomerate->getRemovedVars()[var] && (decision_var[var] || subsumer->getVarElimed()[var] || varReplacer->varHasBeenReplaced(var))));
+                
                 if (value(var) != l_Undef) {
                     assert(!conglomerate->getRemovedVars()[var]);
                     vec<Lit> tmp;
@@ -2036,18 +2041,22 @@ lbool Solver::solve(const vec<Lit>& assumps)
             }
             varReplacer->extendModelImpossible(s);
             subsumer->extendModel(s);
+            conglomerate->extendModel(s);
             
             status = s.solve();
-            assert(status == l_True);
+            if (status != l_True) {
+                printf("c ERROR! Extension of model failed!\n");
+                assert(status == l_True);
+                exit(-1);
+            }
             for (Var var = 0; var < nVars(); var++) {
                 if (assigns[var] == l_Undef && s.model[var] != l_Undef) uncheckedEnqueue(Lit(var, s.model[var] == l_False));
             }
         }
-        conglomerate->doCalcAtFinish();
-        // Extend & copy model:
 #ifndef NDEBUG
         //checkSolution();
 #endif
+        //Copy model:
         model.growTo(nVars());
         for (Var var = 0; var != nVars(); var++) model[var] = value(var);
     
index be234d459dca0fb0fa84cd63b37f1874a61537ab..2c232a3bd58603a8b856aaf539644043c9b769a7 100644 (file)
@@ -25,7 +25,6 @@ OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWA
 #include <cstdio>
 #include <string.h>
 #include <stdio.h>
-
 #ifdef _MSC_VER
 #include <msvc/stdint.h>
 #else
@@ -118,7 +117,6 @@ public:
 
     // Mode of operation:
     //
-    double    var_decay;          // Inverse of the variable activity decay factor.                                            (default 1 / 0.95)
     double    random_var_freq;    // The frequency with which the decision heuristic tries to choose a random variable.        (default 0.02)
     int       restart_first;      // The initial restart limit.                                                                (default 100)
     double    restart_inc;        // The factor with which the restart limit is multiplied in each restart.                    (default 1.5)
@@ -194,11 +192,11 @@ protected:
     // Helper structures:
     //
     struct VarOrderLt {
-        const vec<double>&  activity;
+        const vec<uint32_t>&  activity;
         bool operator () (Var x, Var y) const {
             return activity[x] > activity[y];
         }
-        VarOrderLt(const vec<double>&  act) : activity(act) { }
+        VarOrderLt(const vec<uint32_t>&  act) : activity(act) { }
     };
 
     friend class VarFilter;
@@ -217,8 +215,8 @@ protected:
     vec<Clause*>        binaryClauses;    // Binary clauses are regularly moved here
     vec<XorClause*>     xorclauses;       // List of problem xor-clauses. Will be freed
     vec<Clause*>        learnts;          // List of learnt clauses.
-    vec<double>         activity;         // A heuristic measurement of the activity of a variable.
-    double              var_inc;          // Amount to bump next variable with.
+    vec<uint32_t>       activity;         // A heuristic measurement of the activity of a variable.
+    uint32_t            var_inc;          // Amount to bump next variable with.
     vec<vec<Watched> >  watches;          // 'watches[lit]' is a list of constraints watching 'lit' (will go there if literal becomes true).
     vec<vec<XorClausePtr> > xorwatches;   // 'xorwatches[var]' is a list of constraints watching var in XOR clauses.
     vec<vec<WatchedBin> >  binwatches;
@@ -370,18 +368,19 @@ inline void Solver::insertVarOrder(Var x)
 
 inline void Solver::varDecayActivity()
 {
-    var_inc *= var_decay;
+    var_inc *= 11;
+    var_inc /= 10;
 }
 inline void Solver::varBumpActivity(Var v)
 {
-    if ( (activity[v] += var_inc) > 1e100 ) {
+    if ( (activity[v] += var_inc) > (0x1U) << 24 ) {
         //printf("RESCALE!!!!!!\n");
         //std::cout << "var_inc: " << var_inc << std::endl;
         // Rescale:
         for (Var var = 0; var != nVars(); var++) {
-            activity[var] *= 1e-95;
+            activity[var] >>= 14;
         }
-        var_inc *= 1e-100;
+        var_inc >>= 14;
         //var_inc = 1;
         //std::cout << "var_inc: " << var_inc << std::endl;
         
index f0c9492c576936c734d23a481e821c66e8ae4cae..40152cd5cbafd68d6a7bcffe2af434c459a2f7a8 100644 (file)
@@ -701,7 +701,7 @@ void Subsumer::fillCannotEliminate()
             cannot_eliminate[c[i2].var()] = true;
     }
     
-    const vector<bool>& tmp2 = solver.conglomerate->getRemovedVars();
+    const vec<bool>& tmp2 = solver.conglomerate->getRemovedVars();
     for (uint32_t i = 0; i < tmp2.size(); i++) {
         if (tmp2[i]) cannot_eliminate[i] = true;
     }
index 053ca7f7b0516d445def6cfabcfd5014f40f5f48..f3f456b6716c09043853899f2c67f5251ac37470 100644 (file)
@@ -1,3 +1,2 @@
 CryptoMiniSat
-GIT revision: fb3f0713d5864d50cae28535b577fb74fd65899c
-
+GIT revision: 3c04fa48505107a294986a85131b05a67c479ba1
index 9e36ca39932d8097329165fb0af03c5c642fb84b..e499ac45cab2653c580e548d625ef18da4f3608e 100644 (file)
@@ -93,7 +93,7 @@ const bool VarReplacer::performReplaceInternal()
     #endif
     
     Var var = 0;
-    const vector<bool>& removedVars = solver.conglomerate->getRemovedVars();
+    const vec<bool>& removedVars = solver.conglomerate->getRemovedVars();
     const vec<lbool>& removedVars2 = solver.partHandler->getSavedState();
     const vec<char>& removedVars3 = solver.subsumer->getVarElimed();
     for (vector<Lit>::const_iterator it = table.begin(); it != table.end(); it++, var++) {
@@ -105,8 +105,8 @@ const bool VarReplacer::performReplaceInternal()
         solver.setDecisionVar(var, false);
         solver.setDecisionVar(it->var(), true);
         
-        double& activity1 = solver.activity[var];
-        double& activity2 = solver.activity[it->var()];
+        uint32_t& activity1 = solver.activity[var];
+        uint32_t& activity2 = solver.activity[it->var()];
         if (wasDecisionVar && activity1 > activity2) {
             activity2 = activity1;
             solver.order_heap.update(it->var());