From a34c5a9450ed6b5d562c846e7c173ea7187fcfbc Mon Sep 17 00:00:00 2001 From: Lev Nachmanson Date: Mon, 4 May 2020 14:21:48 -0700 Subject: [PATCH] bail out on big rational numbers in nla monotone lemmas Signed-off-by: Lev Nachmanson --- src/math/lp/nla_core.cpp | 17 ++++++++++++++++- src/math/lp/nla_core.h | 2 ++ src/math/lp/nla_monotone_lemmas.cpp | 2 ++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/math/lp/nla_core.cpp b/src/math/lp/nla_core.cpp index 70491d251..65d2e009f 100644 --- a/src/math/lp/nla_core.cpp +++ b/src/math/lp/nla_core.cpp @@ -1285,7 +1285,7 @@ lbool core::incremental_linearization(bool constraint_derived) { SASSERT(elists_are_consistent(true)); if (search_level == 1) { m_order.order_lemma(); - } else { // search_level == 2 + } else if (search_level == 2) { m_monotone. monotonicity_lemma(); m_tangents.tangent_lemma(); } @@ -1370,6 +1370,21 @@ void core::update_to_refine_of_var(lpvar j) { } } +bool core::var_is_big(lpvar j) const { + if (var_is_int(j)) + return false; + return val(j).is_big(); +} + +bool core::has_big_num(const monic& m) const { + if (var_is_big(var(m))) + return true; + for (lpvar j : m.vars()) + if (var_is_big(j)) + return true; + return false; +} + bool core::patch_blocker(lpvar u, const monic& m) const { SASSERT(m_to_refine.contains(m.var())); if (var_is_used_in_a_correct_monic(u)) { diff --git a/src/math/lp/nla_core.h b/src/math/lp/nla_core.h index 5b370c49d..df84eff62 100644 --- a/src/math/lp/nla_core.h +++ b/src/math/lp/nla_core.h @@ -424,6 +424,8 @@ public: bool try_to_patch(lpvar, const rational&, const monic&); bool to_refine_is_correct() const; bool patch_blocker(lpvar u, const monic& m) const; + bool has_big_num(const monic&) const; + bool var_is_big(lpvar) const; }; // end of core struct pp_mon { diff --git a/src/math/lp/nla_monotone_lemmas.cpp b/src/math/lp/nla_monotone_lemmas.cpp index 8114732e2..05ffade3a 100644 --- a/src/math/lp/nla_monotone_lemmas.cpp +++ b/src/math/lp/nla_monotone_lemmas.cpp @@ -37,6 +37,8 @@ void monotone::monotonicity_lemma(monic const& m) { SASSERT(!check_monic(m)); if (c().mon_has_zero(m.vars())) return; + if (c().has_big_num(m)) + return; const rational prod_val = abs(c().product_value(m)); const rational m_val = abs(var_val(m)); if (m_val < prod_val)