-
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
54 changed files
with
7,912 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
Oops, something went wrong.