CryptoMiniSat
-GIT revision: 8dccdf7df73e761aba7a8c9a0251e2327a9bd97c
+GIT revision: fb8c4dc98c93f0034e20ce4b068457215a4047e8
}*/
#endif //REPLACE_STATISTICS
- solver.clauseCleaner->cleanClauses(solver.clauses, ClauseCleaner::clauses);
- solver.clauseCleaner->cleanClauses(solver.learnts, ClauseCleaner::learnts);
- solver.clauseCleaner->cleanClauses(solver.xorclauses, ClauseCleaner::xorclauses);
- solver.clauseCleaner->removeSatisfied(solver.binaryClauses, ClauseCleaner::binaryClauses);
- if (solver.ok == false)
- return false;
+ solver.clauseCleaner->removeAndCleanAll(true);
+ if (solver.ok == false) return false;
#ifdef VERBOSE_DEBUG
{
lastReplacedVars = replacedVars;
- if (!replace_set(solver.clauses)) return false;
- if (!replace_set(solver.learnts)) return false;
- if (!replace_set(solver.binaryClauses)) return false;
-
- if (!replace_set(solver.xorclauses, true)) return false;
- if (!replace_set(solver.conglomerate->getCalcAtFinish(), false)) return false;
+ if (!replace_set(solver.clauses)) goto end;
+ if (!replace_set(solver.learnts)) goto end;
+ if (!replace_set(solver.binaryClauses)) goto end;
+ if (!replace_set(solver.xorclauses)) goto end;
+end:
for (uint i = 0; i != clauses.size(); i++)
solver.removeClause(*clauses[i]);
clauses.clear();
if (solver.verbosity >= 2) {
- std::cout << " Replaced " << std::setw(8) << replacedLits<< " lits"
+ std::cout << "c | Replaced " << std::setw(8) << replacedLits<< " lits"
<< " Time: " << std::setw(8) << std::fixed << std::setprecision(2) << cpuTime()-time << " s "
<< std::setw(12) << " |" << std::endl;
}
return solver.ok;
}
-const bool VarReplacer::replace_set(vec<XorClause*>& cs, const bool isAttached)
+const bool VarReplacer::replace_set(vec<XorClause*>& cs)
{
XorClause **a = cs.getData();
XorClause **r = a;
}
}
- if (isAttached && changed && handleUpdatedClause(c, origVar1, origVar2)) {
+ if (changed && handleUpdatedClause(c, origVar1, origVar2)) {
if (solver.ok == false) {
- for(;r != end; r++)
- free(*r);
+ for(;r != end; r++) free(*r);
cs.shrink(r-a);
return false;
}
if (changed && handleUpdatedClause(c, origLit1, origLit2)) {
if (solver.ok == false) {
- for(;r != end; r++)
- free(*r);
+ for(;r != end; r++) free(*r);
cs.shrink(r-a);
return false;
}
const bool performReplaceInternal();
const bool replace_set(vec<Clause*>& set);
- const bool replace_set(vec<XorClause*>& cs, const bool isAttached);
+ const bool replace_set(vec<XorClause*>& cs);
const bool handleUpdatedClause(Clause& c, const Lit origLit1, const Lit origLit2);
const bool handleUpdatedClause(XorClause& c, const Var origVar1, const Var origVar2);
template<class T>
toRemove.clear();
toRemove.resize(cls.size(), false);
+ toLeaveInPlace.clear();
+ toLeaveInPlace.resize(cls.size(), false);
table.clear();
table.reserve(cls.size());
uint i = 0;
for (Clause **it = cls.getData(), **end = it + cls.size(); it != end; it++, i++) {
const uint size = (*it)->size();
- if ( size > maxSize || size < minSize) continue;
+ if ( size > maxSize || size < minSize) {
+ toLeaveInPlace[i] = true;
+ continue;
+ }
if ((*it)->getSorted()) sortedTable.push_back(make_pair(*it, i));
else unsortedTable.push_back(make_pair(*it, i));
}
}
#endif //DEBUG_XORFIND
- if (findXors(sumLengths) == false)
- return false;
+ if (findXors(sumLengths) == false) goto end;
+ S->ok = (S->propagate() == NULL);
+end:
if (S->verbosity >= 2) {
if (minSize == maxSize && minSize == 2)
printf("c | Finding binary XORs: %5.2lf s (found: %7d, avg size: %3.1lf) |\n", cpuTime()-time, foundXors, (double)sumLengths/(double)foundXors);
printf("c | Finding non-binary XORs: %5.2lf s (found: %7d, avg size: %3.1lf) |\n", cpuTime()-time, foundXors, (double)sumLengths/(double)foundXors);
}
- if (type == ClauseCleaner::binaryClauses) {
- i = 0;
- uint j = 0;
- for (uint size = table.size(); i != size; i++) {
- if (!toRemove[table[i].second]) {
- table[i].first->setSorted();
- cls[j++] = table[i].first;
- }
+ i = 0;
+ uint32_t j = 0;
+ uint32_t toSkip = 0;
+ for (uint end = cls.size(); i != end; i++) {
+ if (toLeaveInPlace[i]) {
+ cls[j] = cls[i];
+ j++;
+ toSkip++;
+ continue;
+ }
+ if (!toRemove[table[i-toSkip].second]) {
+ table[i-toSkip].first->setSorted();
+ cls[j] = table[i-toSkip].first;
+ j++;
}
- cls.shrink(i-j);
- } else if (foundXors > 0)
- clearToRemove();
+ }
+ cls.shrink(i-j);
- return S->ok = (S->propagate() == NULL);
+ return S->ok;
}
const bool XorFinder::findXors(uint& sumLengths)
switch(lits.size()) {
case 2: {
- if (S->varReplacer->replace(lits, impair, old_group) == false)
- return false;
+ S->varReplacer->replace(lits, impair, old_group);
#ifdef VERBOSE_DEBUG
XorClause* x = XorClause_new(lits, impair, old_group);
sumLengths += lits.size();
}
- return true;
+ return S->ok;
}
void XorFinder::clearToRemove()
ClauseTable table;
vector<bool> toRemove;
+ vector<bool> toLeaveInPlace;
void clearToRemove();
uint32_t foundXors;