3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-18 11:58:31 +00:00

update types and docs

This commit is contained in:
Jakob Rath 2022-12-16 13:16:55 +01:00
parent c54c564019
commit 9f05f645c1
2 changed files with 26 additions and 22 deletions

View file

@ -586,9 +586,9 @@ namespace polysat {
if constexpr (mode == query_t::find_viable) if constexpr (mode == query_t::find_viable)
res = query_find(v, result.first, result.second); res = query_find(v, result.first, result.second);
else if constexpr (mode == query_t::min_viable) else if constexpr (mode == query_t::min_viable)
res = query_min(v, result) ? l_true : l_undef; res = query_min(v, result);
else if constexpr (mode == query_t::max_viable) else if constexpr (mode == query_t::max_viable)
res = query_max(v, result) ? l_true : l_undef; res = query_max(v, result);
else if constexpr (mode == query_t::has_viable) { else if constexpr (mode == query_t::has_viable) {
NOT_IMPLEMENTED_YET(); NOT_IMPLEMENTED_YET();
} }
@ -674,14 +674,14 @@ namespace polysat {
return l_true; return l_true;
} }
bool viable::query_min(pvar v, rational& lo) { lbool viable::query_min(pvar v, rational& lo) {
// TODO: should be able to deal with UNSAT case; since also min_viable has to deal with it due to fallback solver // TODO: should be able to deal with UNSAT case; since also min_viable has to deal with it due to fallback solver
lo = 0; lo = 0;
entry* e = m_units[v]; entry* e = m_units[v];
if (!e && !refine_viable(v, lo)) if (!e && !refine_viable(v, lo))
return false; return l_undef;
if (!e) if (!e)
return true; return l_true;
entry* first = e; entry* first = e;
entry* last = first->prev(); entry* last = first->prev();
if (last->interval.currently_contains(lo)) if (last->interval.currently_contains(lo))
@ -694,19 +694,19 @@ namespace polysat {
} }
while (e != first); while (e != first);
if (!refine_viable(v, lo)) if (!refine_viable(v, lo))
return false; return l_undef;
SASSERT(is_viable(v, lo)); SASSERT(is_viable(v, lo));
return true; return l_true;
} }
bool viable::query_max(pvar v, rational& hi) { lbool viable::query_max(pvar v, rational& hi) {
// TODO: should be able to deal with UNSAT case; since also max_viable has to deal with it due to fallback solver // TODO: should be able to deal with UNSAT case; since also max_viable has to deal with it due to fallback solver
hi = s.var2pdd(v).max_value(); hi = s.var2pdd(v).max_value();
auto* e = m_units[v]; auto* e = m_units[v];
if (!e && !refine_viable(v, hi)) if (!e && !refine_viable(v, hi))
return false; return l_undef;
if (!e) if (!e)
return true; return l_true;
entry* last = e->prev(); entry* last = e->prev();
e = last; e = last;
do { do {
@ -717,9 +717,9 @@ namespace polysat {
} }
while (e != last); while (e != last);
if (!refine_viable(v, hi)) if (!refine_viable(v, hi))
return false; return l_undef;
SASSERT(is_viable(v, hi)); SASSERT(is_viable(v, hi));
return true; return l_true;
} }
template <query_t mode> template <query_t mode>

View file

@ -105,28 +105,32 @@ namespace polysat {
void propagate(pvar v, rational const& val); void propagate(pvar v, rational const& val);
// return true if done, false if refined /**
bool query_min(pvar v, rational& out_lo); * Interval-based queries
* @return l_true on success, l_false on conflict, l_undef on refinement
*/
lbool query_min(pvar v, rational& out_lo);
lbool query_max(pvar v, rational& out_hi);
lbool query_find(pvar v, rational& out_lo, rational& out_hi);
// return true if done, false if refined /**
bool query_max(pvar v, rational& out_hi); * Bitblasting-based queries.
* The univariate solver has already been filled with all relevant constraints and check() returned l_true.
// return true if done, false if resource out * @return l_true on success, l_false on conflict, l_undef on resource limit
*/
lbool query_min_fallback(pvar v, univariate_solver& us, rational& out_lo); lbool query_min_fallback(pvar v, univariate_solver& us, rational& out_lo);
lbool query_max_fallback(pvar v, univariate_solver& us, rational& out_hi); lbool query_max_fallback(pvar v, univariate_solver& us, rational& out_hi);
// return resource_out if refined
lbool query_find(pvar v, rational& out_lo, rational& out_hi);
lbool query_find_fallback(pvar v, univariate_solver& us, rational& out_lo, rational& out_hi); lbool query_find_fallback(pvar v, univariate_solver& us, rational& out_lo, rational& out_hi);
/** /**
* Interval query with bounded refinement and fallback to bitblasting. * Interval-based query with bounded refinement and fallback to bitblasting.
* @return l_true on success, l_false on conflict, l_undef on resource limit * @return l_true on success, l_false on conflict, l_undef on resource limit
*/ */
template <viable_query::query_t mode> template <viable_query::query_t mode>
lbool query(pvar v, typename viable_query::query_result<mode>::result_t& out_result); lbool query(pvar v, typename viable_query::query_result<mode>::result_t& out_result);
/** /**
* Bitblasting-based query.
* @return l_true on success, l_false on conflict, l_undef on resource limit * @return l_true on success, l_false on conflict, l_undef on resource limit
*/ */
template <viable_query::query_t mode> template <viable_query::query_t mode>