-
Notifications
You must be signed in to change notification settings - Fork 18
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Naive implementation of subset-minimal unsat core
- Loading branch information
Showing
36 changed files
with
690 additions
and
35 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
|
||
#include "MinUnsatCoreBuilder.h" | ||
|
||
#include <api/MainSolver.h> | ||
|
||
namespace opensmt { | ||
|
||
std::unique_ptr<UnsatCore> MinUnsatCoreBuilder::build() { | ||
buildBody(); | ||
return buildReturn(); | ||
} | ||
|
||
void MinUnsatCoreBuilder::buildBody() { | ||
UnsatCoreBuilder::buildBody(); | ||
minimize(); | ||
} | ||
|
||
void MinUnsatCoreBuilder::minimize() { | ||
minimizeInit(); | ||
minimizeAlg(); | ||
minimizeFinish(); | ||
} | ||
|
||
void MinUnsatCoreBuilder::minimizeInit() { | ||
assert(terms.size() >= namedTerms.size()); | ||
assert(size_t(namedTerms.size()) == namedTermsIdxs.size()); | ||
} | ||
|
||
void MinUnsatCoreBuilder::minimizeAlgNaive() { | ||
if (namedTerms.size() == 0) return; | ||
|
||
auto const namedTermsIdxsEnd = namedTermsIdxs.end(); | ||
auto const isNamedTerm = [namedTermsIdxsEnd](size_t idx, auto namedTermsIdxsIt) { | ||
if (namedTermsIdxsIt == namedTermsIdxsEnd) { return false; } | ||
assert(idx <= *namedTermsIdxsIt); | ||
return (idx == *namedTermsIdxsIt); | ||
}; | ||
decltype(terms) newTerms; | ||
size_t const termsSize = terms.size(); | ||
for (auto [idx, namedTermsIdxsIt] = std::tuple{size_t{0}, namedTermsIdxs.begin()}; idx < termsSize; ++idx) { | ||
if (isNamedTerm(idx, namedTermsIdxsIt)) { | ||
++namedTermsIdxsIt; | ||
continue; | ||
} | ||
PTRef term = terms[idx]; | ||
smtSolverPtr->insertFormula(term); | ||
newTerms.push(term); | ||
} | ||
|
||
decltype(terms) newNamedTerms; | ||
size_t const namedTermsSize = namedTerms.size(); | ||
for (size_t namedIdx = 0; namedIdx < namedTermsSize; ++namedIdx) { | ||
smtSolverPtr->push(); | ||
|
||
// try to ignore namedTerms[namedIdx] | ||
|
||
for (size_t keptNamedIdx = namedIdx + 1; keptNamedIdx < namedTermsSize; ++keptNamedIdx) { | ||
PTRef term = namedTerms[keptNamedIdx]; | ||
smtSolverPtr->insertFormula(term); | ||
} | ||
|
||
sstat const res = smtSolverPtr->check(); | ||
assert(res == s_True || res == s_False); | ||
bool const isRedundant = (res == s_False); | ||
|
||
smtSolverPtr->pop(); | ||
|
||
if (isRedundant) continue; | ||
|
||
// namedTerms[namedIdx] is not redundant - include it | ||
|
||
PTRef term = namedTerms[namedIdx]; | ||
smtSolverPtr->insertFormula(term); | ||
newTerms.push(term); | ||
newNamedTerms.push(term); | ||
} | ||
|
||
terms = std::move(newTerms); | ||
namedTerms = std::move(newNamedTerms); | ||
} | ||
|
||
} // namespace opensmt |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
#ifndef OPENSMT_MINUNSATCOREBUILDER_H | ||
#define OPENSMT_MINUNSATCOREBUILDER_H | ||
|
||
#include "UnsatCoreBuilder.h" | ||
|
||
namespace opensmt { | ||
|
||
class MainSolver; | ||
|
||
class MinUnsatCoreBuilder : public UnsatCoreBuilder { | ||
public: | ||
using SMTSolver = MainSolver; | ||
|
||
MinUnsatCoreBuilder(SMTConfig const & conf, Proof const & proof_, PartitionManager const & pmanager, | ||
TermNames const & names, std::unique_ptr<SMTSolver> && smtSolver) | ||
: UnsatCoreBuilder(conf, proof_, pmanager, names), | ||
smtSolverPtr{std::move(smtSolver)} {} | ||
|
||
std::unique_ptr<UnsatCore> build(); | ||
|
||
protected: | ||
void buildBody(); | ||
|
||
void minimize(); | ||
|
||
void minimizeInit(); | ||
void minimizeAlg() { minimizeAlgNaive(); } | ||
void minimizeFinish() {} | ||
|
||
void minimizeAlgNaive(); | ||
|
||
std::unique_ptr<SMTSolver> smtSolverPtr; | ||
}; | ||
|
||
} // namespace opensmt | ||
|
||
#endif // OPENSMT_MINUNSATCOREBUILDER_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
(set-option :produce-unsat-cores true) | ||
(set-option :minimal-unsat-cores true) | ||
(set-logic QF_UF) | ||
(declare-fun b1 () Bool) | ||
(declare-fun b2 () Bool) | ||
(assert (! b1 :named a1)) | ||
(assert (! (and b1 b2) :named a2)) | ||
(assert (! (or (not b1) (not b2)) :named a3)) | ||
(check-sat) | ||
(get-unsat-core) | ||
(exit) |
Empty file.
2 changes: 2 additions & 0 deletions
2
test/regression/base/generic/overlap_min_unsat_core.smt2.expected.out
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
unsat | ||
( a2 a3 ) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
(set-option :produce-unsat-cores true) | ||
(set-logic QF_UF) | ||
(declare-fun b1 () Bool) | ||
(declare-fun b2 () Bool) | ||
(assert (! b1 :named a1)) | ||
(assert (! (and b1 b2) :named a2)) | ||
(assert (! (or (not b1) (not b2)) :named a3)) | ||
(check-sat) | ||
(get-unsat-core) | ||
(exit) |
Empty file.
2 changes: 2 additions & 0 deletions
2
test/regression/base/generic/overlap_unsat_core.smt2.expected.out
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
unsat | ||
( a1 a2 a3 ) |
17 changes: 17 additions & 0 deletions
17
test/regression/base/generic/redundant_min_unsat_core.smt2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
(set-option :produce-unsat-cores true) | ||
(set-option :minimal-unsat-cores true) | ||
|
||
(set-logic QF_UF) | ||
|
||
(declare-const b1 Bool) | ||
(declare-const b2 Bool) | ||
|
||
(assert (! b1 :named a1)) | ||
(assert (! b2 :named a2)) | ||
(assert (! (not b1) :named a3)) | ||
(assert (! (and b1 b2) :named x1)) | ||
(assert (! (or b1 b2) :named x2)) | ||
(assert (! (xor b1 b2) :named x3)) | ||
|
||
(check-sat) | ||
(get-unsat-core) |
Empty file.
2 changes: 2 additions & 0 deletions
2
test/regression/base/generic/redundant_min_unsat_core.smt2.expected.out
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
unsat | ||
( a1 a3 ) |
17 changes: 17 additions & 0 deletions
17
test/regression/base/generic/redundant_min_unsat_core2.smt2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
(set-option :produce-unsat-cores true) | ||
(set-option :minimal-unsat-cores true) | ||
|
||
(set-logic QF_UF) | ||
|
||
(declare-const b1 Bool) | ||
(declare-const b2 Bool) | ||
|
||
(assert (! (and b1 b2) :named x1)) | ||
(assert (! (or b1 b2) :named x2)) | ||
(assert (! (xor b1 b2) :named x3)) | ||
(assert (! b1 :named a1)) | ||
(assert (! b2 :named a2)) | ||
(assert (! (not b1) :named a3)) | ||
|
||
(check-sat) | ||
(get-unsat-core) |
Empty file.
2 changes: 2 additions & 0 deletions
2
test/regression/base/generic/redundant_min_unsat_core2.smt2.expected.out
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
unsat | ||
( x1 x3 ) |
Oops, something went wrong.