3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2026-05-15 14:45:33 +00:00

preserve random seed in nlsat_solver::check_lemma

Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
Lev Nachmanson 2026-02-02 13:31:33 -10:00
parent f1a6f85ae5
commit 60f9edb65f
6 changed files with 32 additions and 10 deletions

View file

@ -361,7 +361,6 @@ namespace nlsat {
TRACE(nlsat_explain, tout << "lc: " << lc << " reduct: " << reduct << "\n";);
insert_fresh_factors_in_todo(lc);
if (!is_zero(lc) && sign(lc)) {
insert_fresh_factors_in_todo(lc);
TRACE(nlsat_explain, tout << "lc does no vaninsh\n";);
return;
}

View file

@ -35,6 +35,7 @@ namespace nlsat {
interval_set_manager(anum_manager & m, small_object_allocator & a);
void set_seed(unsigned s) { m_rand.set_seed(s); }
unsigned get_seed() const { return m_rand.get_seed(); }
/**
\brief Return the empty set.

View file

@ -1141,6 +1141,10 @@ namespace nlsat {
TRACE(nlsat, display(tout << "check lemma: ", n, cls) << "\n";
display(tout););
// Save RNG state before check_lemma to ensure determinism
unsigned saved_random_seed = m_random_seed;
unsigned saved_ism_seed = m_ism.get_seed();
try {
// Create a separate reslimit for the checker with 10 second timeout
reslimit checker_rlimit;
@ -1157,11 +1161,19 @@ namespace nlsat {
checker.m_apply_lws = false; // Disable levelwise for checker to avoid recursive issues
scoped_bool_vars tr(checker);
if (!setup_checker(checker, tr, n, cls, a))
if (!setup_checker(checker, tr, n, cls, a)) {
// Restore RNG state
m_random_seed = saved_random_seed;
m_ism.set_seed(saved_ism_seed);
return; // Lemma contains untranslatable atoms, skip check
}
lbool r = checker.check();
if (r == l_undef) // Checker timed out - skip this lemma check
return;
if (r == l_undef) {
// Restore RNG state
m_random_seed = saved_random_seed;
m_ism.set_seed(saved_ism_seed);
return; // Checker timed out - skip this lemma check
}
if (r == l_true) {
// Before reporting unsound, dump the lemma to see what we're checking
@ -1175,6 +1187,10 @@ namespace nlsat {
catch (...) {
// Ignore exceptions from the checker - just skip this lemma check
}
// Restore RNG state after check_lemma
m_random_seed = saved_random_seed;
m_ism.set_seed(saved_ism_seed);
}
void log_lemma(std::ostream& out, clause const& cls, std::string annotation) {

View file

@ -345,6 +345,7 @@ public:
}
void set_seed(unsigned s) { m_data = s; }
unsigned get_seed() const { return m_data; }
int operator()() {
return ((m_data = m_data * 214013L + 2531011L) >> 16) & 0x7fff;