Skip to content

Commit e41acd7

Browse files
convert m_r_upper and m_r_lower bounds to plain vectors
manage backtracking state together with backtracking of column data.
1 parent fae6094 commit e41acd7

File tree

6 files changed

+46
-24
lines changed

6 files changed

+46
-24
lines changed

src/math/lp/int_branch.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ int int_branch::find_inf_int_base_column() {
7575
if (!lia.column_is_int_inf(j))
7676
continue;
7777
usage = lra.usage_in_terms(j);
78-
if (lia.is_boxed(j) && (range = lcs.m_r_upper_bounds()[j].x - lcs.m_r_lower_bounds()[j].x - rational(2*usage)) <= small_value) {
78+
if (lia.is_boxed(j) && (range = lcs.m_r_upper_bounds[j].x - lcs.m_r_lower_bounds[j].x - rational(2*usage)) <= small_value) {
7979
result = j;
8080
k++;
8181
n = 1;
@@ -98,7 +98,7 @@ int int_branch::find_inf_int_base_column() {
9898
continue;
9999
SASSERT(!lia.is_fixed(j));
100100
usage = lra.usage_in_terms(j);
101-
new_range = lcs.m_r_upper_bounds()[j].x - lcs.m_r_lower_bounds()[j].x - rational(2*usage);
101+
new_range = lcs.m_r_upper_bounds[j].x - lcs.m_r_lower_bounds[j].x - rational(2*usage);
102102
if (new_range < range) {
103103
n = 1;
104104
result = j;

src/math/lp/lar_core_solver.h

+3-7
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ class lar_core_solver {
2929
stacked_vector<column_type> m_column_types;
3030
// r - solver fields, for rational numbers
3131

32-
stacked_vector<numeric_pair<mpq>> m_r_lower_bounds;
33-
stacked_vector<numeric_pair<mpq>> m_r_upper_bounds;
32+
vector<numeric_pair<mpq>> m_r_lower_bounds;
33+
vector<numeric_pair<mpq>> m_r_upper_bounds;
3434
static_matrix<mpq, numeric_pair<mpq>> m_r_A;
3535
stacked_vector<unsigned> m_r_pushed_basis;
3636
vector<unsigned> m_r_basis;
@@ -121,15 +121,11 @@ class lar_core_solver {
121121
m_stacked_simplex_strategy = settings().simplex_strategy();
122122
m_stacked_simplex_strategy.push();
123123
m_column_types.push();
124-
// rational
125-
m_r_lower_bounds.push();
126-
m_r_upper_bounds.push();
124+
// rational
127125
}
128126

129127
void pop(unsigned k) {
130128
// rationals
131-
m_r_lower_bounds.pop(k);
132-
m_r_upper_bounds.pop(k);
133129
m_column_types.pop(k);
134130

135131
m_r_x.resize(m_r_A.column_count());

src/math/lp/lar_core_solver_def.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ lar_core_solver::lar_core_solver(
2727
m_r_heading,
2828
m_costs_dummy,
2929
m_column_types(),
30-
m_r_lower_bounds(),
31-
m_r_upper_bounds(),
30+
m_r_lower_bounds,
31+
m_r_upper_bounds,
3232
settings,
3333
column_names) {
3434
}

src/math/lp/lar_solver.cpp

+28-12
Original file line numberDiff line numberDiff line change
@@ -421,14 +421,14 @@ namespace lp {
421421
auto& val = lcs.r_x(j);
422422
switch (lcs.m_column_types()[j]) {
423423
case column_type::boxed: {
424-
const auto& l = lcs.m_r_lower_bounds()[j];
425-
if (val == l || val == lcs.m_r_upper_bounds()[j]) return false;
424+
const auto& l = lcs.m_r_lower_bounds[j];
425+
if (val == l || val == lcs.m_r_upper_bounds[j]) return false;
426426
set_value_for_nbasic_column(j, l);
427427
return true;
428428
}
429429

430430
case column_type::lower_bound: {
431-
const auto& l = lcs.m_r_lower_bounds()[j];
431+
const auto& l = lcs.m_r_lower_bounds[j];
432432
if (val != l) {
433433
set_value_for_nbasic_column(j, l);
434434
return true;
@@ -437,7 +437,7 @@ namespace lp {
437437
}
438438
case column_type::fixed:
439439
case column_type::upper_bound: {
440-
const auto & u = lcs.m_r_upper_bounds()[j];
440+
const auto & u = lcs.m_r_upper_bounds[j];
441441
if (val != u) {
442442
set_value_for_nbasic_column(j, u);
443443
return true;
@@ -574,15 +574,31 @@ namespace lp {
574574
A_r().pop(k);
575575
}
576576

577+
struct lar_solver::column_update_trail : public trail {
578+
lar_solver& s;
579+
column_update_trail(lar_solver& s) : s(s) {}
580+
void undo() override {
581+
auto& [is_upper, j, bound, column] = s.m_column_updates.back();
582+
if (is_upper)
583+
s.m_mpq_lar_core_solver.m_r_upper_bounds[j] = bound;
584+
else
585+
s.m_mpq_lar_core_solver.m_r_lower_bounds[j] = bound;
586+
s.m_columns[j] = column;
587+
s.m_column_updates.pop_back();
588+
}
589+
};
590+
577591
void lar_solver::set_upper_bound_witness(lpvar j, u_dependency* dep, impq const& high) {
578-
m_trail.push(vector_value_trail(m_columns, j));
592+
m_column_updates.push_back({true, j, get_upper_bound(j), m_columns[j]});
593+
m_trail.push(column_update_trail(*this));
579594
m_columns[j].set_upper_bound_witness(dep);
580595
m_mpq_lar_core_solver.m_r_upper_bounds[j] = high;
581596
insert_to_columns_with_changed_bounds(j);
582597
}
583598

584599
void lar_solver::set_lower_bound_witness(lpvar j, u_dependency* dep, impq const& low) {
585-
m_trail.push(vector_value_trail(m_columns, j));
600+
m_column_updates.push_back({false, j, get_lower_bound(j), m_columns[j]});
601+
m_trail.push(column_update_trail(*this));
586602
m_columns[j].set_lower_bound_witness(dep);
587603
m_mpq_lar_core_solver.m_r_lower_bounds[j] = low;
588604
insert_to_columns_with_changed_bounds(j);
@@ -1084,7 +1100,7 @@ namespace lp {
10841100
const column& ul = m_columns[var];
10851101
dep = ul.lower_bound_witness();
10861102
if (dep != nullptr) {
1087-
auto& p = m_mpq_lar_core_solver.m_r_lower_bounds()[var];
1103+
auto& p = m_mpq_lar_core_solver.m_r_lower_bounds[var];
10881104
value = p.x;
10891105
is_strict = p.y.is_pos();
10901106
return true;
@@ -1103,7 +1119,7 @@ namespace lp {
11031119
const column& ul = m_columns[var];
11041120
dep = ul.upper_bound_witness();
11051121
if (dep != nullptr) {
1106-
auto& p = m_mpq_lar_core_solver.m_r_upper_bounds()[var];
1122+
auto& p = m_mpq_lar_core_solver.m_r_upper_bounds[var];
11071123
value = p.x;
11081124
is_strict = p.y.is_neg();
11091125
return true;
@@ -1625,8 +1641,8 @@ namespace lp {
16251641
// 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
16261642
m_mpq_lar_core_solver.resize_x(j + 1);
16271643
auto& rslv = m_mpq_lar_core_solver.m_r_solver;
1628-
m_mpq_lar_core_solver.m_r_lower_bounds.increase_size_by_one();
1629-
m_mpq_lar_core_solver.m_r_upper_bounds.increase_size_by_one();
1644+
m_mpq_lar_core_solver.m_r_lower_bounds.reserve(j + 1);
1645+
m_mpq_lar_core_solver.m_r_upper_bounds.reserve(j + 1);
16301646
rslv.inf_heap_increase_size_by_one();
16311647
rslv.m_costs.resize(j + 1);
16321648
rslv.m_d.resize(j + 1);
@@ -2264,9 +2280,9 @@ namespace lp {
22642280
impq ivalue(value);
22652281
auto& lcs = m_mpq_lar_core_solver;
22662282

2267-
if (column_has_upper_bound(j) && lcs.m_r_upper_bounds()[j] < ivalue)
2283+
if (column_has_upper_bound(j) && lcs.m_r_upper_bounds[j] < ivalue)
22682284
return false;
2269-
if (column_has_lower_bound(j) && lcs.m_r_lower_bounds()[j] > ivalue)
2285+
if (column_has_lower_bound(j) && lcs.m_r_lower_bounds[j] > ivalue)
22702286
return false;
22712287

22722288
set_value_for_nbasic_column(j, ivalue);

src/math/lp/lar_solver.h

+10
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,14 @@ class lar_solver : public column_namer {
7373
}
7474
};
7575

76+
struct column_update {
77+
bool is_upper;
78+
unsigned j;
79+
impq bound;
80+
column column;
81+
};
82+
struct column_update_trail;
83+
7684
//////////////////// fields //////////////////////////
7785
trail_stack m_trail;
7886
lp_settings m_settings;
@@ -86,6 +94,8 @@ class lar_solver : public column_namer {
8694
bool m_need_register_terms = false;
8795
var_register m_var_register;
8896
svector<column> m_columns;
97+
vector<column_update> m_column_updates;
98+
8999
constraint_set m_constraints;
90100
// the set of column indices j such that bounds have changed for j
91101
indexed_uint_set m_columns_with_changed_bounds;

src/math/lp/lp_core_solver_base.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,7 @@ class lp_core_solver_base {
437437
}
438438

439439
std::ostream& print_column_info(unsigned j, std::ostream & out, bool print_nl = false, const std::string& var_prefix = "j") const {
440-
if (j >= m_lower_bounds.size()) {
440+
if (j >= m_column_types.size()) {
441441
out << "[" << j << "] is not present\n";
442442
return out;
443443
}

0 commit comments

Comments
 (0)