mirror of
https://github.com/Z3Prover/z3
synced 2025-04-30 04:15:51 +00:00
Polysat: conflict resolution updates (#5534)
* variable elimination / saturation sketch * conflict resolution updates
This commit is contained in:
parent
dc547510db
commit
9f387f5738
14 changed files with 343 additions and 294 deletions
|
@ -26,7 +26,9 @@ namespace polysat {
|
|||
class ule_constraint;
|
||||
class signed_constraint;
|
||||
|
||||
using constraint_table = ptr_hashtable<constraint, obj_ptr_hash<constraint>, deref_eq<constraint>>;
|
||||
using constraint_hash = obj_ptr_hash<constraint>;
|
||||
using constraint_eq = deref_eq<constraint>;
|
||||
using constraint_table = ptr_hashtable<constraint, constraint_hash, constraint_eq>;
|
||||
|
||||
// Manage constraint lifetime, deduplication, and connection to boolean variables/literals.
|
||||
class constraint_manager {
|
||||
|
@ -134,6 +136,7 @@ namespace polysat {
|
|||
|
||||
virtual unsigned hash() const = 0;
|
||||
virtual bool operator==(constraint const& other) const = 0;
|
||||
bool operator!=(constraint const& other) const { return !operator==(other); }
|
||||
|
||||
bool is_eq() const { return m_kind == ckind_t::eq_t; }
|
||||
bool is_ule() const { return m_kind == ckind_t::ule_t; }
|
||||
|
@ -155,12 +158,13 @@ namespace polysat {
|
|||
unsigned_vector& vars() { return m_vars; }
|
||||
unsigned_vector const& vars() const { return m_vars; }
|
||||
unsigned var(unsigned idx) const { return m_vars[idx]; }
|
||||
bool contains_var(pvar v) const { return m_vars.contains(v); }
|
||||
unsigned level() const { return m_level; }
|
||||
bool has_bvar() const { return m_bvar != sat::null_bool_var; }
|
||||
sat::bool_var bvar() const { return m_bvar; }
|
||||
|
||||
clause* unit_clause() const { return m_unit_clause; }
|
||||
void set_unit_clause(clause* cl) { SASSERT(cl); SASSERT(!m_unit_clause || m_unit_clause == cl); m_unit_clause = cl; }
|
||||
void set_unit_clause(clause* cl);
|
||||
p_dependency* unit_dep() const { return m_unit_clause ? m_unit_clause->dep() : nullptr; }
|
||||
|
||||
/** Precondition: all variables other than v are assigned.
|
||||
|
@ -175,6 +179,7 @@ namespace polysat {
|
|||
|
||||
inline std::ostream& operator<<(std::ostream& out, constraint const& c) { return c.display(out); }
|
||||
|
||||
|
||||
class signed_constraint final {
|
||||
public:
|
||||
using ptr_t = constraint*;
|
||||
|
@ -219,9 +224,13 @@ namespace polysat {
|
|||
|
||||
signed_constraint& operator=(std::nullptr_t) { m_constraint = nullptr; return *this; }
|
||||
|
||||
unsigned hash() const {
|
||||
return combine_hash(get_ptr_hash(get()), bool_hash()(is_positive()));
|
||||
}
|
||||
bool operator==(signed_constraint const& other) const {
|
||||
return get() == other.get() && is_positive() == other.is_positive();
|
||||
}
|
||||
bool operator!=(signed_constraint const& other) const { return !operator==(other); }
|
||||
|
||||
std::ostream& display(std::ostream& out) const {
|
||||
if (m_constraint)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue