@@ -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);
0 commit comments