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:
parent
f1a6f85ae5
commit
60f9edb65f
6 changed files with 32 additions and 10 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue