From 6e5f92fe7c71fdbd11f28a11071bd3d37e429c82 Mon Sep 17 00:00:00 2001 From: Guy Date: Wed, 27 Jul 2016 12:54:29 -0700 Subject: [PATCH] Added an option for a more aggressive weakest implicant optimization --- src/options/proof_options | 3 +++ src/proof/proof_manager.cpp | 22 +++++++++++++--------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/options/proof_options b/src/options/proof_options index a99d858bc..8a496bda6 100644 --- a/src/options/proof_options +++ b/src/options/proof_options @@ -8,4 +8,7 @@ module PROOF "options/proof_options.h" Proof option lfscLetification --lfsc-letification bool :default true turns on global letification in LFSC proofs +option aggressiveCoreMin --aggressive-core-min bool :default false + turns on aggressive unsat core minimization (experimental) + endmodule diff --git a/src/proof/proof_manager.cpp b/src/proof/proof_manager.cpp index 0e683b084..a0b25fab1 100644 --- a/src/proof/proof_manager.cpp +++ b/src/proof/proof_manager.cpp @@ -348,7 +348,8 @@ Node ProofManager::getWeakestImplicantInUnsatCore(Node lemma) { Assert(PROOF_ON(), "Cannot compute unsat core when proofs are off"); Assert(unsatCoreAvailable(), "Cannot get unsat core at this time. Mabye the input is SAT?" ); - if (lemma.getKind() != kind::AND) + // If we're doing aggressive minimization, work on all lemmas, not just conjunctions. + if (!options::aggressiveCoreMin() && (lemma.getKind() != kind::AND)) return lemma; constructSatProof(); @@ -377,15 +378,18 @@ Node ProofManager::getWeakestImplicantInUnsatCore(Node lemma) { for (lemmaIt = currentLemma.begin(); lemmaIt != currentLemma.end(); ++lemmaIt) { builder << *lemmaIt; - // Sanity check: make sure that each conjunct really appears in the original lemma - bool found = false; - for (unsigned i = 0; i < lemma.getNumChildren(); ++i) { - if (lemma[i] == *lemmaIt) - found = true; + // Unless in aggressive mode, check that each conjunct appears in the original + // lemma. + if (!options::aggressiveCoreMin()) { + bool found = false; + for (unsigned i = 0; i < lemma.getNumChildren(); ++i) { + if (lemma[i] == *lemmaIt) + found = true; + } + + if (!found) + return lemma; } - - if (!found) - return lemma; } } } -- 2.30.2