mirror of
https://github.com/Z3Prover/z3
synced 2025-04-22 16:45:31 +00:00
alternate
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
609c46395f
commit
2bd335db81
6 changed files with 17 additions and 11 deletions
|
@ -256,8 +256,9 @@ namespace sat {
|
|||
m_use_list_index.push_back(m_flat_use_list.size());
|
||||
}
|
||||
|
||||
void ddfw::flip(bool_var v) {
|
||||
bool ddfw::flip(bool_var v) {
|
||||
++m_flips;
|
||||
bool new_unsat = false;
|
||||
literal lit = literal(v, !value(v));
|
||||
literal nlit = ~lit;
|
||||
SASSERT(is_true(lit));
|
||||
|
@ -273,6 +274,7 @@ namespace sat {
|
|||
verbose_stream() << "flipping unit clause " << ci << "\n";
|
||||
#endif
|
||||
m_unsat.insert_fresh(cls_idx);
|
||||
new_unsat = true;
|
||||
auto const& c = get_clause(cls_idx);
|
||||
for (literal l : c) {
|
||||
inc_reward(l, w);
|
||||
|
@ -314,6 +316,7 @@ namespace sat {
|
|||
}
|
||||
value(v) = !value(v);
|
||||
update_reward_avg(v);
|
||||
return new_unsat;
|
||||
}
|
||||
|
||||
bool ddfw::should_reinit_weights() {
|
||||
|
|
|
@ -252,7 +252,7 @@ namespace sat {
|
|||
|
||||
void remove_assumptions();
|
||||
|
||||
void flip(bool_var v);
|
||||
bool flip(bool_var v);
|
||||
|
||||
inline double get_reward(bool_var v) const { return m_vars[v].m_reward; }
|
||||
|
||||
|
|
|
@ -65,7 +65,7 @@ namespace sls {
|
|||
virtual vector<sat::clause_info> const& clauses() const = 0;
|
||||
virtual sat::clause_info const& get_clause(unsigned idx) const = 0;
|
||||
virtual ptr_iterator<unsigned> get_use_list(sat::literal lit) = 0;
|
||||
virtual void flip(sat::bool_var v) = 0;
|
||||
virtual bool flip(sat::bool_var v) = 0;
|
||||
virtual double reward(sat::bool_var v) = 0;
|
||||
virtual double get_weigth(unsigned clause_idx) = 0;
|
||||
virtual bool is_true(sat::literal lit) = 0;
|
||||
|
@ -167,7 +167,7 @@ namespace sls {
|
|||
sat::literal mk_literal(expr* e);
|
||||
void add_clause(expr* f);
|
||||
void add_clause(sat::literal_vector const& lits);
|
||||
void flip(sat::bool_var v) { s.flip(v); }
|
||||
bool flip(sat::bool_var v) { return s.flip(v); }
|
||||
double reward(sat::bool_var v) { return s.reward(v); }
|
||||
indexed_uint_set const& unsat() const { return s.unsat(); }
|
||||
unsigned rand() { return m_rand(); }
|
||||
|
|
|
@ -44,6 +44,7 @@ namespace sls {
|
|||
}
|
||||
|
||||
void euf_plugin::start_propagation() {
|
||||
m_incremental = !m_incremental;
|
||||
m_g = alloc(euf::egraph, m);
|
||||
std::function<void(std::ostream&, void*)> dj = [&](std::ostream& out, void* j) {
|
||||
out << "lit " << to_literal(reinterpret_cast<size_t*>(j));
|
||||
|
@ -111,16 +112,18 @@ namespace sls {
|
|||
|
||||
if (ctx.is_unit(l))
|
||||
continue;
|
||||
lits.push_back(~l);
|
||||
//verbose_stream() << "reward " << l << " " << ctx.reward(l.var()) << "\n";
|
||||
|
||||
if (!lits.contains(~l))
|
||||
lits.push_back(~l);
|
||||
|
||||
if (ctx.reward(l.var()) > reward)
|
||||
n = 0, reward = ctx.reward(l.var());
|
||||
|
||||
if (ctx.rand(++n) == 0)
|
||||
flit = l;
|
||||
}
|
||||
//verbose_stream() << "conflict: " << lits << " flip " << flit << "\n";
|
||||
|
||||
ctx.add_clause(lits);
|
||||
|
||||
if (flit == sat::null_literal)
|
||||
return;
|
||||
do {
|
||||
|
@ -132,7 +135,7 @@ namespace sls {
|
|||
while (slit != flit);
|
||||
// flip the last literal on the replay stack
|
||||
IF_VERBOSE(10, verbose_stream() << "sls.euf - flip " << flit << "\n");
|
||||
ctx.flip(flit.var());
|
||||
ctx.flip(flit.var());
|
||||
m_replay_stack.back().neg();
|
||||
}
|
||||
|
||||
|
|
|
@ -87,7 +87,7 @@ namespace sls {
|
|||
vector<sat::clause_info> const& clauses() const override { return m_ddfw.clauses(); }
|
||||
sat::clause_info const& get_clause(unsigned idx) const override { return m_ddfw.get_clause_info(idx); }
|
||||
ptr_iterator<unsigned> get_use_list(sat::literal lit) override { return m_ddfw.use_list(lit); }
|
||||
void flip(sat::bool_var v) override { if (m_dirty) m_ddfw.reinit(), m_dirty = false; m_ddfw.flip(v); }
|
||||
bool flip(sat::bool_var v) override { if (m_dirty) m_ddfw.reinit(), m_dirty = false; return m_ddfw.flip(v); }
|
||||
double reward(sat::bool_var v) override { return m_ddfw.get_reward(v); }
|
||||
double get_weigth(unsigned clause_idx) override { return m_ddfw.get_clause_info(clause_idx).m_weight; }
|
||||
bool is_true(sat::literal lit) override { return m_ddfw.get_value(lit.var()) != lit.sign(); }
|
||||
|
|
|
@ -125,7 +125,7 @@ namespace sls {
|
|||
vector<sat::clause_info> const& clauses() const override { return m_ddfw->clauses(); }
|
||||
sat::clause_info const& get_clause(unsigned idx) const override { return m_ddfw->get_clause_info(idx); }
|
||||
ptr_iterator<unsigned> get_use_list(sat::literal lit) override { return m_ddfw->use_list(lit); }
|
||||
void flip(sat::bool_var v) override { m_ddfw->flip(v); }
|
||||
bool flip(sat::bool_var v) override { return m_ddfw->flip(v); }
|
||||
double reward(sat::bool_var v) override { return m_ddfw->get_reward(v); }
|
||||
double get_weigth(unsigned clause_idx) override { return m_ddfw->get_clause_info(clause_idx).m_weight; }
|
||||
bool is_true(sat::literal lit) override { return m_ddfw->get_value(lit.var()) != lit.sign(); }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue