3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-08-26 21:16:02 +00:00

port look for 0 witness

Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
Lev Nachmanson 2024-08-06 18:25:31 -10:00 committed by Lev Nachmanson
parent a09e412cf0
commit 0306eff692
4 changed files with 58 additions and 27 deletions

View file

@ -684,33 +684,50 @@ namespace nlsat {
return new_set;
}
void interval_set_manager::peek_in_complement(interval_set const * s, bool is_int, anum & w, bool randomize) {
int compare_interval_with_zero(const interval &now, const scoped_anum &zero, anum_manager & m) {
if (!now.m_upper_inf) {
int sgn = m.compare(now.m_upper, zero);
if (sgn < 0)
return -1;
if (sgn == 0 && now.m_upper_open)
return -1;
}
if (!now.m_lower_inf) {
int sgn = m.compare(now.m_lower, zero);
if (sgn > 0)
return 1;
if (sgn == 0 && now.m_lower_open)
return 1;
}
return 0;
}
void interval_set_manager::pick_in_complement(interval_set const * s, bool is_int, anum & w, bool randomize, bool look_for_zero) {
SASSERT(!is_full(s));
if (s == nullptr) {
if (randomize) {
int num = m_rand() % 2 == 0 ? 1 : -1;
#define MAX_RANDOM_DEN_K 4
int den_k = (m_rand() % MAX_RANDOM_DEN_K);
int den = is_int ? 1 : (1 << den_k);
scoped_mpq _w(m_am.qm());
m_am.qm().set(_w, num, den);
m_am.set(w, _w);
}
else {
m_am.set(w, 0);
}
m_am.set(w, 0);
return;
}
unsigned n = 0;
unsigned num = num_intervals(s);
if (!s->m_intervals[0].m_lower_inf) {
// lower is not -oo
n++;
m_am.int_lt(s->m_intervals[0].m_lower, w);
if (!randomize)
return;
if (look_for_zero) {
scoped_anum zero(m_am);
m_am.set(zero, 0);
bool available = true;
for (unsigned i = 0; i < num; ++i) {
int sgn = compare_interval_with_zero(s->m_intervals[i], zero, m_am);
if (sgn == 0) {
available = false;
break;
}
if (sgn > 0)
break;
}
if (available) {
m_am.set(w, 0);
return ;
}
}
if (!s->m_intervals[num-1].m_upper_inf) {
// upper is not oo
@ -720,6 +737,16 @@ namespace nlsat {
if (!randomize)
return;
}
if (!s->m_intervals[0].m_lower_inf) {
// lower is not -oo
n++;
m_am.int_lt(s->m_intervals[0].m_lower, w);
if (!randomize)
return;
}
// Try to find a gap that is not an unit.
for (unsigned i = 1; i < num; i++) {
@ -770,5 +797,4 @@ namespace nlsat {
out << "*";
return out;
}
};