@@ -421,14 +421,14 @@ namespace lp {
421
421
auto & val = lcs.r_x (j);
422
422
switch (lcs.m_column_types ()[j]) {
423
423
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 ;
426
426
set_value_for_nbasic_column (j, l);
427
427
return true ;
428
428
}
429
429
430
430
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];
432
432
if (val != l) {
433
433
set_value_for_nbasic_column (j, l);
434
434
return true ;
@@ -437,7 +437,7 @@ namespace lp {
437
437
}
438
438
case column_type::fixed:
439
439
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];
441
441
if (val != u) {
442
442
set_value_for_nbasic_column (j, u);
443
443
return true ;
@@ -574,15 +574,31 @@ namespace lp {
574
574
A_r ().pop (k);
575
575
}
576
576
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
+
577
591
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 ));
579
594
m_columns[j].set_upper_bound_witness (dep);
580
595
m_mpq_lar_core_solver.m_r_upper_bounds [j] = high;
581
596
insert_to_columns_with_changed_bounds (j);
582
597
}
583
598
584
599
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 ));
586
602
m_columns[j].set_lower_bound_witness (dep);
587
603
m_mpq_lar_core_solver.m_r_lower_bounds [j] = low;
588
604
insert_to_columns_with_changed_bounds (j);
@@ -1084,7 +1100,7 @@ namespace lp {
1084
1100
const column& ul = m_columns[var];
1085
1101
dep = ul.lower_bound_witness ();
1086
1102
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];
1088
1104
value = p.x ;
1089
1105
is_strict = p.y .is_pos ();
1090
1106
return true ;
@@ -1103,7 +1119,7 @@ namespace lp {
1103
1119
const column& ul = m_columns[var];
1104
1120
dep = ul.upper_bound_witness ();
1105
1121
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];
1107
1123
value = p.x ;
1108
1124
is_strict = p.y .is_neg ();
1109
1125
return true ;
@@ -1625,8 +1641,8 @@ namespace lp {
1625
1641
// 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
1626
1642
m_mpq_lar_core_solver.resize_x (j + 1 );
1627
1643
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 );
1630
1646
rslv.inf_heap_increase_size_by_one ();
1631
1647
rslv.m_costs .resize (j + 1 );
1632
1648
rslv.m_d .resize (j + 1 );
@@ -2264,9 +2280,9 @@ namespace lp {
2264
2280
impq ivalue (value);
2265
2281
auto & lcs = m_mpq_lar_core_solver;
2266
2282
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)
2268
2284
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)
2270
2286
return false ;
2271
2287
2272
2288
set_value_for_nbasic_column (j, ivalue);
0 commit comments