bool is_target(expr * var, rational & val) { bool strict; return is_uninterp_const(var) && (!m_normalize_int_only || m_util.is_int(var)) && m_bm.has_lower(var, val, strict) && !val.is_zero(); }
unsigned context::scoped_state::add(expr* f, rational const& w, symbol const& id) { if (w.is_neg()) { throw default_exception("Negative weight supplied. Weight should be positive"); } if (w.is_zero()) { throw default_exception("Zero weight supplied. Weight should be positive"); } if (!m.is_bool(f)) { throw default_exception("Soft constraint should be Boolean"); } if (!m_indices.contains(id)) { m_objectives.push_back(objective(m, id)); m_indices.insert(id, m_objectives.size() - 1); } SASSERT(m_indices.contains(id)); unsigned idx = m_indices[id]; m_objectives[idx].m_terms.push_back(f); m_objectives[idx].m_weights.push_back(w); m_objectives_term_trail.push_back(idx); return idx; }
std::ostream& tangents::print_tangent_domain(const point &a, const point &b, std::ostream& out) const { out << "("; print_point(a, out); out << ", "; print_point(b, out); out << ")"; return out; } void tangents::generate_simple_tangent_lemma(const rooted_mon* rm) { if (rm->size() != 2) return; TRACE("nla_solver", tout << "rm:"; m_core->print_rooted_monomial_with_vars(*rm, tout) << std::endl;); m_core->add_empty_lemma(); unsigned i_mon = rm->orig_index(); const monomial & m = c().m_monomials[i_mon]; const rational v = c().product_value(m); const rational& mv = vvr(m); SASSERT(mv != v); SASSERT(!mv.is_zero() && !v.is_zero()); rational sign = rational(nla::rat_sign(mv)); if (sign != nla::rat_sign(v)) { c().generate_simple_sign_lemma(-sign, m); return; } bool gt = abs(mv) > abs(v); if (gt) { for (lpvar j : m) { const rational & jv = vvr(j); rational js = rational(nla::rat_sign(jv)); c().mk_ineq(js, j, llc::LT); c().mk_ineq(js, j, llc::GT, jv); } c().mk_ineq(sign, i_mon, llc::LE, std::max(v, rational(-1))); } else {