mirror of
https://github.com/Z3Prover/z3
synced 2025-08-12 14:10:54 +00:00
store bit-intervals that were used
This commit is contained in:
parent
3740e766f7
commit
39bee180de
2 changed files with 21 additions and 9 deletions
|
@ -1461,7 +1461,7 @@ namespace polysat {
|
||||||
|
|
||||||
rational const& max_value = s.var2pdd(v).max_value();
|
rational const& max_value = s.var2pdd(v).max_value();
|
||||||
|
|
||||||
lbool result_lo = find_on_layer(v, widths.size() - 1, widths, overlaps, fbi, rational::zero(), max_value, lo);
|
lbool result_lo = find_on_layers(v, widths, overlaps, fbi, rational::zero(), max_value, lo);
|
||||||
if (result_lo == l_false)
|
if (result_lo == l_false)
|
||||||
return l_false; // conflict
|
return l_false; // conflict
|
||||||
if (result_lo == l_undef)
|
if (result_lo == l_undef)
|
||||||
|
@ -1472,7 +1472,7 @@ namespace polysat {
|
||||||
return l_true;
|
return l_true;
|
||||||
}
|
}
|
||||||
|
|
||||||
lbool result_hi = find_on_layer(v, widths.size() - 1, widths, overlaps, fbi, lo + 1, max_value, hi);
|
lbool result_hi = find_on_layers(v, widths, overlaps, fbi, lo + 1, max_value, hi);
|
||||||
if (result_hi == l_false)
|
if (result_hi == l_false)
|
||||||
hi = lo; // no other viable value
|
hi = lo; // no other viable value
|
||||||
if (result_hi == l_undef)
|
if (result_hi == l_undef)
|
||||||
|
@ -1505,8 +1505,22 @@ namespace polysat {
|
||||||
return {nullptr, false};
|
return {nullptr, false};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lbool viable::find_on_layers(pvar const v, unsigned_vector const& widths, pvar_vector const& overlaps, fixed_bits_info const& fbi, rational const& to_cover_lo, rational const& to_cover_hi, rational& val) {
|
||||||
|
ptr_vector<entry> refine_todo;
|
||||||
|
|
||||||
|
lbool result = find_on_layer(v, widths.size() - 1, widths, overlaps, fbi, to_cover_lo, to_cover_hi, val, refine_todo);
|
||||||
|
|
||||||
|
// store bit intervals we have used
|
||||||
|
for (entry* e : refine_todo)
|
||||||
|
intersect(v, e);
|
||||||
|
|
||||||
|
// TODO: other refinements
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
// find viable values in half-open interval [to_cover_lo;to_cover_hi[ w.r.t. unit intervals on the given layer
|
// find viable values in half-open interval [to_cover_lo;to_cover_hi[ w.r.t. unit intervals on the given layer
|
||||||
lbool viable::find_on_layer(pvar v, unsigned w_idx, unsigned_vector const& widths, pvar_vector const& overlaps, fixed_bits_info const& fbi, rational const& to_cover_lo, rational const& to_cover_hi, rational& val) {
|
lbool viable::find_on_layer(pvar const v, unsigned const w_idx, unsigned_vector const& widths, pvar_vector const& overlaps, fixed_bits_info const& fbi, rational const& to_cover_lo, rational const& to_cover_hi, rational& val, ptr_vector<entry>& refine_todo) {
|
||||||
|
|
||||||
unsigned const w = widths[w_idx];
|
unsigned const w = widths[w_idx];
|
||||||
rational const& mod_value = rational::power_of_two(w);
|
rational const& mod_value = rational::power_of_two(w);
|
||||||
|
@ -1556,9 +1570,6 @@ namespace polysat {
|
||||||
rational const to_cover_len = r_interval::len(to_cover_lo, to_cover_hi, mod_value);
|
rational const to_cover_len = r_interval::len(to_cover_lo, to_cover_hi, mod_value);
|
||||||
val = to_cover_lo;
|
val = to_cover_lo;
|
||||||
|
|
||||||
// TODO: for each e in refine_todo, intersect(v, e);
|
|
||||||
svector<std::pair<pvar, entry*>> refine_todo;
|
|
||||||
|
|
||||||
rational progress; // = 0
|
rational progress; // = 0
|
||||||
while (true) {
|
while (true) {
|
||||||
entry* e = nullptr;
|
entry* e = nullptr;
|
||||||
|
@ -1580,7 +1591,7 @@ namespace polysat {
|
||||||
if (!e) {
|
if (!e) {
|
||||||
e = refine_bits<true>(v, val, w, fbi);
|
e = refine_bits<true>(v, val, w, fbi);
|
||||||
if (e) {
|
if (e) {
|
||||||
refine_todo.push_back({v, e});
|
refine_todo.push_back(e);
|
||||||
display_one(std::cerr << "found entry by bits: ", 0, e) << "\n";
|
display_one(std::cerr << "found entry by bits: ", 0, e) << "\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1651,7 +1662,7 @@ namespace polysat {
|
||||||
}
|
}
|
||||||
|
|
||||||
rational a;
|
rational a;
|
||||||
lbool result = find_on_layer(v, w_idx - 1, widths, overlaps, fbi, lower_cover_lo, lower_cover_hi, a);
|
lbool result = find_on_layer(v, w_idx - 1, widths, overlaps, fbi, lower_cover_lo, lower_cover_hi, a, refine_todo);
|
||||||
if (result == l_false)
|
if (result == l_false)
|
||||||
return l_false; // conflict
|
return l_false; // conflict
|
||||||
|
|
||||||
|
|
|
@ -205,7 +205,8 @@ namespace polysat {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
lbool find_viable2_new(pvar v, rational& out_lo, rational& out_hi);
|
lbool find_viable2_new(pvar v, rational& out_lo, rational& out_hi);
|
||||||
lbool find_on_layer(pvar v, unsigned w_idx, unsigned_vector const& widths, pvar_vector const& overlaps, fixed_bits_info const& fbi, rational const& to_cover_lo, rational const& to_cover_hi, rational& out_val);
|
lbool viable::find_on_layers(pvar v, unsigned_vector const& widths, pvar_vector const& overlaps, fixed_bits_info const& fbi, rational const& to_cover_lo, rational const& to_cover_hi, rational& out_val);
|
||||||
|
lbool find_on_layer(pvar v, unsigned w_idx, unsigned_vector const& widths, pvar_vector const& overlaps, fixed_bits_info const& fbi, rational const& to_cover_lo, rational const& to_cover_hi, rational& out_val, ptr_vector<entry>& refine_todo);
|
||||||
|
|
||||||
std::pair<entry*, bool> find_value(rational const& val, entry* entries);
|
std::pair<entry*, bool> find_value(rational const& val, entry* entries);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue