summaryrefslogtreecommitdiff
path: root/src/prop/minisat/minisat.cpp
diff options
context:
space:
mode:
authorMathias Preiner <mathias.preiner@gmail.com>2021-04-23 17:57:35 -0700
committerGitHub <noreply@github.com>2021-04-23 19:57:35 -0500
commit47c9c2f42696a1e04577c1a79ac78f4186657818 (patch)
tree99ae5609a32893ed01b5598df39f69efef5127d7 /src/prop/minisat/minisat.cpp
parent335eedb9096db8d4654486f015449621fb146eaa (diff)
Add assumption-based unsat cores. (#6427)
This PR adds an assumption-based unsat cores option. If enabled it will disable proof logging in the SAT solver and adds input assertions as assumptions to the SAT solver. When an unsat core is requested we extract the unsat core in terms of the unsat assumption in the SAT solver. Assumption-based unsat cores use the proof infrastructure to map the input assumptions back to the original assertions.
Diffstat (limited to 'src/prop/minisat/minisat.cpp')
-rw-r--r--src/prop/minisat/minisat.cpp36
1 files changed, 35 insertions, 1 deletions
diff --git a/src/prop/minisat/minisat.cpp b/src/prop/minisat/minisat.cpp
index 813292a21..611416dbc 100644
--- a/src/prop/minisat/minisat.cpp
+++ b/src/prop/minisat/minisat.cpp
@@ -32,7 +32,7 @@ namespace prop {
//// DPllMinisatSatSolver
MinisatSatSolver::MinisatSatSolver(StatisticsRegistry& registry)
- : d_minisat(NULL), d_context(NULL), d_statistics(registry)
+ : d_minisat(NULL), d_context(NULL), d_assumptions(), d_statistics(registry)
{}
MinisatSatSolver::~MinisatSatSolver()
@@ -193,6 +193,40 @@ SatValue MinisatSatSolver::solve() {
return result;
}
+SatValue MinisatSatSolver::solve(const std::vector<SatLiteral>& assumptions)
+{
+ setupOptions();
+ d_minisat->budgetOff();
+
+ d_assumptions.clear();
+ Minisat::vec<Minisat::Lit> assumps;
+
+ for (const SatLiteral& lit : assumptions)
+ {
+ Minisat::Lit mlit = toMinisatLit(lit);
+ assumps.push(mlit);
+ d_assumptions.emplace(lit);
+ }
+
+ SatValue result = toSatLiteralValue(d_minisat->solve(assumps));
+ d_minisat->clearInterrupt();
+ return result;
+}
+
+void MinisatSatSolver::getUnsatAssumptions(
+ std::vector<SatLiteral>& unsat_assumptions)
+{
+ for (size_t i = 0, size = d_minisat->d_conflict.size(); i < size; ++i)
+ {
+ Minisat::Lit mlit = d_minisat->d_conflict[i];
+ SatLiteral lit = ~toSatLiteral(mlit);
+ if (d_assumptions.find(lit) != d_assumptions.end())
+ {
+ unsat_assumptions.push_back(lit);
+ }
+ }
+}
+
bool MinisatSatSolver::ok() const {
return d_minisat->okay();
}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback