mirror of
https://github.com/Z3Prover/z3
synced 2025-06-06 06:03:23 +00:00
cheap_eqs progress
Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
parent
62bd19242e
commit
4a9f031502
1 changed files with 60 additions and 14 deletions
|
@ -37,12 +37,13 @@ class lp_bound_propagator {
|
||||||
unsigned index() const { return m_index; }
|
unsigned index() const { return m_index; }
|
||||||
unsigned id() const { return m_id; }
|
unsigned id() const { return m_id; }
|
||||||
unsigned row() const { return m_row; }
|
unsigned row() const { return m_row; }
|
||||||
|
unsigned parent() const { return m_parent; }
|
||||||
void add_child(vertex& child) {
|
void add_child(vertex& child) {
|
||||||
child.m_parent = m_id;
|
child.m_parent = m_id;
|
||||||
m_children.push_back(child.m_id);
|
m_children.push_back(child.m_id);
|
||||||
}
|
}
|
||||||
std::ostream& print(std::ostream & out) const {
|
std::ostream& print(std::ostream & out) const {
|
||||||
out << "row = " << m_row << ", m_index = " << m_index << ", parent = " << (int)m_parent << " , offset = " << m_offset << "\n";;
|
out << "row = " << m_row << ", m_index = " << m_index << ", parent = " << (int)m_parent << " , offset = " << m_offset << ", id = " << m_id << "\n";;
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -126,14 +127,16 @@ public:
|
||||||
impq(0), // offset
|
impq(0), // offset
|
||||||
0 // id
|
0 // id
|
||||||
);
|
);
|
||||||
m_vertices.push_back(xv);
|
push_to_verts(xv);
|
||||||
vertex yv(row_index,
|
vertex yv(row_index,
|
||||||
y, // index in row
|
y, // index in row
|
||||||
offset,
|
offset,
|
||||||
1 // id
|
1 // id
|
||||||
);
|
);
|
||||||
m_vertices.push_back(yv);
|
push_to_verts(yv);
|
||||||
xv.add_child(yv);
|
xv.add_child(yv);
|
||||||
|
TRACE("cheap_eq", print_tree(tout););
|
||||||
|
SASSERT(tree_is_correct());
|
||||||
}
|
}
|
||||||
bool is_offset_row(unsigned row_index,
|
bool is_offset_row(unsigned row_index,
|
||||||
unsigned & x_index,
|
unsigned & x_index,
|
||||||
|
@ -189,19 +192,42 @@ public:
|
||||||
// we have v_i and v_j, indices of vertices at the same offsets
|
// we have v_i and v_j, indices of vertices at the same offsets
|
||||||
void report_eq(unsigned v_i, unsigned v_j) {
|
void report_eq(unsigned v_i, unsigned v_j) {
|
||||||
SASSERT(v_i != v_j);
|
SASSERT(v_i != v_j);
|
||||||
|
const vertex& u = m_vertices[v_i];
|
||||||
|
const vertex& v = m_vertices[v_j];
|
||||||
|
TRACE("cheap_eq", tout << "v_i = " << v_i << ", v_j = " << v_j << "\nu = "; u.print(tout) << "\nv = "; v.print(tout) <<"\n";);
|
||||||
|
|
||||||
NOT_IMPLEMENTED_YET();
|
NOT_IMPLEMENTED_YET();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool tree_is_correct() const {
|
||||||
|
unsigned id = 0;
|
||||||
|
for (const auto & v : m_vertices) {
|
||||||
|
if (id != v.id()) {
|
||||||
|
TRACE("cheap_eq",
|
||||||
|
tout << "incorrect id at " << id << "\n";);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (id && v.parent() == UINT_MAX) {
|
||||||
|
TRACE("cheap_eq", tout << "incorrect parent "; v.print(tout); );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
id++;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// offset is measured from the initial vertex in the search
|
// offset is measured from the initial vertex in the search
|
||||||
void search_for_collision(const vertex& v, const impq& offset) {
|
void search_for_collision(const vertex& v, const impq& offset) {
|
||||||
TRACE("cheap_eq", tout << "v_i = " ; v.print(tout) << "\n";);
|
TRACE("cheap_eq", tout << "v_i = " ; v.print(tout) << "\n";);
|
||||||
unsigned registered_vert;
|
unsigned registered_vert;
|
||||||
|
|
||||||
if (m_offsets_to_verts.find(offset, registered_vert))
|
if (m_offsets_to_verts.find(offset, registered_vert)) {
|
||||||
report_eq(registered_vert, v.id());
|
if (registered_vert != v.id())
|
||||||
else
|
report_eq(registered_vert, v.id());
|
||||||
|
} else {
|
||||||
m_offsets_to_verts.insert(offset, v.id());
|
m_offsets_to_verts.insert(offset, v.id());
|
||||||
|
}
|
||||||
lpvar j = get_column(v);
|
lpvar j = get_column(v);
|
||||||
if (m_visited_columns.contains(j))
|
if (m_visited_columns.contains(j))
|
||||||
return;
|
return;
|
||||||
|
@ -219,7 +245,7 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// row[x_index] gives x, and row[y_index] gives y
|
// row[x_index] gives x, and row[y_index] gives y
|
||||||
// offset is accumulated during the recursion
|
// offset is accumulated during the recursion
|
||||||
// edge_offset is the one in x - y = edge_offset
|
// edge_offset is the one in x - y = edge_offset
|
||||||
// The parent is taken from m_vertices.back()
|
// The parent is taken from m_vertices.back()
|
||||||
|
@ -228,20 +254,40 @@ public:
|
||||||
const auto& row = lp().get_row(row_index);
|
const auto& row = lp().get_row(row_index);
|
||||||
unsigned parent_id = m_vertices.size() - 1;
|
unsigned parent_id = m_vertices.size() - 1;
|
||||||
vertex xv(row_index, x_index, row_offset, parent_id + 1);
|
vertex xv(row_index, x_index, row_offset, parent_id + 1);
|
||||||
m_vertices.push_back(xv);
|
push_to_verts(xv);
|
||||||
if (parent_id != UINT_MAX) {
|
if (parent_id != UINT_MAX) {
|
||||||
m_vertices[parent_id].add_child(xv);
|
m_vertices[parent_id].add_child(xv);
|
||||||
}
|
}
|
||||||
vertex yv(row_index, y_index, row_offset, parent_id + 2);
|
vertex yv(row_index, y_index, row_offset, parent_id + 2);
|
||||||
m_vertices.push_back(yv);
|
|
||||||
xv.add_child(yv);
|
xv.add_child(yv);
|
||||||
|
push_to_verts(yv);
|
||||||
|
TRACE("cheap_eq", print_tree(tout););
|
||||||
|
m_visited_rows.insert(row_index);
|
||||||
search_for_collision(xv, offset);
|
search_for_collision(xv, offset);
|
||||||
|
TRACE("cheap_eq", print_tree(tout););
|
||||||
|
SASSERT(tree_is_correct());
|
||||||
}
|
}
|
||||||
|
|
||||||
void add_column_edge(unsigned parent, lpvar j, unsigned index_in_row) {
|
void push_to_verts(const vertex& v) {
|
||||||
NOT_IMPLEMENTED_YET();
|
TRACE("cheap_eq", tout << "v = "; v.print(tout););
|
||||||
|
m_vertices.push_back(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void add_column_edge(unsigned parent, unsigned row_index, unsigned index_in_row) {
|
||||||
|
TRACE("cheap_eq", tout << "parent=" << parent << ", row_index = " << row_index << "\n";);
|
||||||
|
vertex v(row_index, index_in_row, impq(0), m_vertices.size());
|
||||||
|
m_vertices[parent].add_child(v);
|
||||||
|
push_to_verts(v);
|
||||||
|
TRACE("cheap_eq", tout << "tree = "; print_tree(tout););
|
||||||
|
SASSERT(tree_is_correct());
|
||||||
|
}
|
||||||
|
std::ostream& print_tree(std::ostream & out) const {
|
||||||
|
for (auto & v : m_vertices) {
|
||||||
|
v.print(out);
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
lpvar get_column(const vertex& v) const {
|
lpvar get_column(const vertex& v) const {
|
||||||
return lp().get_row(v.row())[v.index()].var();
|
return lp().get_row(v.row())[v.index()].var();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue