summaryrefslogtreecommitdiff
path: root/src/theory/arith/nl/nonlinear_extension.cpp
diff options
context:
space:
mode:
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>2021-03-15 14:08:03 -0500
committerGitHub <noreply@github.com>2021-03-15 19:08:03 +0000
commit216f3c9fb07a08909942b91a2a4739cd178f5a72 (patch)
tree00de2d826d1b4ad6124856536923a2463c4d8641 /src/theory/arith/nl/nonlinear_extension.cpp
parent6cbb7824dabd7ab8e85472a22ba30ad2498afebc (diff)
Make nonlinear extension account for relevant term set (#6147)
This fixes a subtle issue with non-linear and theory combination. It currently could use irrelevant terms preregistered to the ExtTheory for its model-based refinement. This means that the non-linear extension could accidentally modify values for terms that are not included in its term set, violating theory combination. In particular, in the minimized example from #5662, (* a k) was a stale term in ExtTheory, and non-linear extension falsely believed that a was a term whose model value could be modified, since moreover a was not a shared term. In reality, a was not a shared term since it only was registered to UF. Fixes #5662.
Diffstat (limited to 'src/theory/arith/nl/nonlinear_extension.cpp')
-rw-r--r--src/theory/arith/nl/nonlinear_extension.cpp19
1 files changed, 15 insertions, 4 deletions
diff --git a/src/theory/arith/nl/nonlinear_extension.cpp b/src/theory/arith/nl/nonlinear_extension.cpp
index 671c3f44a..25aebf6d4 100644
--- a/src/theory/arith/nl/nonlinear_extension.cpp
+++ b/src/theory/arith/nl/nonlinear_extension.cpp
@@ -301,7 +301,7 @@ void NonlinearExtension::check(Theory::Effort e)
}
}
-bool NonlinearExtension::modelBasedRefinement()
+bool NonlinearExtension::modelBasedRefinement(const std::set<Node>& termSet)
{
++(d_stats.d_mbrRuns);
d_checkCounter++;
@@ -317,8 +317,18 @@ bool NonlinearExtension::modelBasedRefinement()
Trace("nl-ext") << "# false asserts = " << false_asserts.size() << std::endl;
// get the extended terms belonging to this theory
+ std::vector<Node> xtsAll;
+ d_extTheory.getTerms(xtsAll);
+ // only consider those that are currently relevant based on the current
+ // assertions, i.e. those contained in termSet
std::vector<Node> xts;
- d_extTheory.getTerms(xts);
+ for (const Node& x : xtsAll)
+ {
+ if (termSet.find(x) != termSet.end())
+ {
+ xts.push_back(x);
+ }
+ }
if (Trace.isOn("nl-ext-debug"))
{
@@ -496,7 +506,8 @@ bool NonlinearExtension::modelBasedRefinement()
return false;
}
-void NonlinearExtension::interceptModel(std::map<Node, Node>& arithModel)
+void NonlinearExtension::interceptModel(std::map<Node, Node>& arithModel,
+ const std::set<Node>& termSet)
{
if (!needsCheckLastEffort())
{
@@ -509,7 +520,7 @@ void NonlinearExtension::interceptModel(std::map<Node, Node>& arithModel)
if (!d_builtModel.get())
{
Trace("nl-ext") << "interceptModel: do model-based refinement" << std::endl;
- modelBasedRefinement();
+ modelBasedRefinement(termSet);
}
if (d_builtModel.get())
{
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback