3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-05-12 02:04:43 +00:00

convert m_r_upper and m_r_lower bounds to plain vectors

manage backtracking state together with backtracking of column data.
This commit is contained in:
Nikolaj Bjorner 2025-04-23 16:33:38 -07:00
parent fae60946bf
commit e41acd7b50
6 changed files with 46 additions and 24 deletions

View file

@ -421,14 +421,14 @@ namespace lp {
auto& val = lcs.r_x(j);
switch (lcs.m_column_types()[j]) {
case column_type::boxed: {
const auto& l = lcs.m_r_lower_bounds()[j];
if (val == l || val == lcs.m_r_upper_bounds()[j]) return false;
const auto& l = lcs.m_r_lower_bounds[j];
if (val == l || val == lcs.m_r_upper_bounds[j]) return false;
set_value_for_nbasic_column(j, l);
return true;
}
case column_type::lower_bound: {
const auto& l = lcs.m_r_lower_bounds()[j];
const auto& l = lcs.m_r_lower_bounds[j];
if (val != l) {
set_value_for_nbasic_column(j, l);
return true;
@ -437,7 +437,7 @@ namespace lp {
}
case column_type::fixed:
case column_type::upper_bound: {
const auto & u = lcs.m_r_upper_bounds()[j];
const auto & u = lcs.m_r_upper_bounds[j];
if (val != u) {
set_value_for_nbasic_column(j, u);
return true;
@ -574,15 +574,31 @@ namespace lp {
A_r().pop(k);
}
struct lar_solver::column_update_trail : public trail {
lar_solver& s;
column_update_trail(lar_solver& s) : s(s) {}
void undo() override {
auto& [is_upper, j, bound, column] = s.m_column_updates.back();
if (is_upper)
s.m_mpq_lar_core_solver.m_r_upper_bounds[j] = bound;
else
s.m_mpq_lar_core_solver.m_r_lower_bounds[j] = bound;
s.m_columns[j] = column;
s.m_column_updates.pop_back();
}
};
void lar_solver::set_upper_bound_witness(lpvar j, u_dependency* dep, impq const& high) {
m_trail.push(vector_value_trail(m_columns, j));
m_column_updates.push_back({true, j, get_upper_bound(j), m_columns[j]});
m_trail.push(column_update_trail(*this));
m_columns[j].set_upper_bound_witness(dep);
m_mpq_lar_core_solver.m_r_upper_bounds[j] = high;
insert_to_columns_with_changed_bounds(j);
}
void lar_solver::set_lower_bound_witness(lpvar j, u_dependency* dep, impq const& low) {
m_trail.push(vector_value_trail(m_columns, j));
m_column_updates.push_back({false, j, get_lower_bound(j), m_columns[j]});
m_trail.push(column_update_trail(*this));
m_columns[j].set_lower_bound_witness(dep);
m_mpq_lar_core_solver.m_r_lower_bounds[j] = low;
insert_to_columns_with_changed_bounds(j);
@ -1084,7 +1100,7 @@ namespace lp {
const column& ul = m_columns[var];
dep = ul.lower_bound_witness();
if (dep != nullptr) {
auto& p = m_mpq_lar_core_solver.m_r_lower_bounds()[var];
auto& p = m_mpq_lar_core_solver.m_r_lower_bounds[var];
value = p.x;
is_strict = p.y.is_pos();
return true;
@ -1103,7 +1119,7 @@ namespace lp {
const column& ul = m_columns[var];
dep = ul.upper_bound_witness();
if (dep != nullptr) {
auto& p = m_mpq_lar_core_solver.m_r_upper_bounds()[var];
auto& p = m_mpq_lar_core_solver.m_r_upper_bounds[var];
value = p.x;
is_strict = p.y.is_neg();
return true;
@ -1625,8 +1641,8 @@ namespace lp {
// SASSERT(m_mpq_lar_core_solver.m_r_lower_bounds.size() == j && m_mpq_lar_core_solver.m_r_upper_bounds.size() == j); // restore later
m_mpq_lar_core_solver.resize_x(j + 1);
auto& rslv = m_mpq_lar_core_solver.m_r_solver;
m_mpq_lar_core_solver.m_r_lower_bounds.increase_size_by_one();
m_mpq_lar_core_solver.m_r_upper_bounds.increase_size_by_one();
m_mpq_lar_core_solver.m_r_lower_bounds.reserve(j + 1);
m_mpq_lar_core_solver.m_r_upper_bounds.reserve(j + 1);
rslv.inf_heap_increase_size_by_one();
rslv.m_costs.resize(j + 1);
rslv.m_d.resize(j + 1);
@ -2264,9 +2280,9 @@ namespace lp {
impq ivalue(value);
auto& lcs = m_mpq_lar_core_solver;
if (column_has_upper_bound(j) && lcs.m_r_upper_bounds()[j] < ivalue)
if (column_has_upper_bound(j) && lcs.m_r_upper_bounds[j] < ivalue)
return false;
if (column_has_lower_bound(j) && lcs.m_r_lower_bounds()[j] > ivalue)
if (column_has_lower_bound(j) && lcs.m_r_lower_bounds[j] > ivalue)
return false;
set_value_for_nbasic_column(j, ivalue);