@@ -488,12 +488,8 @@ namespace lp {
488
488
// m_changed_columns are the columns that just became fixed, or those that just stopped being fixed.
489
489
// If such a column appears in an entry it has to be recalculated.
490
490
indexed_uint_set m_changed_columns;
491
- enum class term_status {
492
- no_change,
493
- change, // need to find changed rows depending on the term
494
- bound_change // need to tighten the term
495
- };
496
- std_vector<term_status> m_changed_terms;
491
+ indexed_uint_set m_changed_terms; // represented by term columns
492
+ indexed_uint_set m_terms_to_tighten; // represented by term columns
497
493
indexed_uint_set m_tightened_columns; // the column that got tightened by the tigthening phase,
498
494
// m_column_to_terms[j] is the set of all k such lra.get_term(k) depends on j
499
495
std::unordered_map<unsigned , std::unordered_set<unsigned >> m_columns_to_terms;
@@ -759,9 +755,7 @@ namespace lp {
759
755
760
756
void mark_term_change (unsigned j) {
761
757
TRACE (" dio" , tout << " marked term change j:" << j << std::endl;);
762
- if (j >= m_changed_terms.size ())
763
- m_changed_terms.resize (j + 1 , term_status::no_change);
764
- m_changed_terms[j] = term_status::change;
758
+ m_changed_terms.insert (j);
765
759
}
766
760
767
761
void update_column_bound_callback (unsigned j) {
@@ -999,13 +993,8 @@ namespace lp {
999
993
1000
994
void process_changed_columns (std_vector<unsigned > &f_vector) {
1001
995
find_changed_terms_and_more_changed_rows ();
1002
- for (unsigned j = 0 ; j < m_changed_terms.size (); j++) {
1003
- term_status t = m_changed_terms[j];
1004
- if (t != term_status::change) {
1005
- TRACE (" dio" , tout << " went on continue\n " ;);
1006
- continue ;
1007
- }
1008
- m_changed_terms[j] = term_status::bound_change; // prepare for tightening
996
+ for (unsigned j: m_changed_terms) {
997
+ m_terms_to_tighten.insert (j);
1009
998
if (j < m_l_matrix.column_count ()) {
1010
999
for (const auto & cs : m_l_matrix.column (j)) {
1011
1000
m_changed_rows.insert (cs.var ());
@@ -1051,7 +1040,7 @@ namespace lp {
1051
1040
eliminate_substituted_in_changed_rows ();
1052
1041
m_changed_columns.reset ();
1053
1042
m_changed_rows.reset ();
1054
- // do not clean up m_changed_terms as they are used in tighten_terms_with_S()
1043
+ m_changed_terms. reset ();
1055
1044
SASSERT (entries_are_ok ());
1056
1045
}
1057
1046
@@ -1388,14 +1377,14 @@ namespace lp {
1388
1377
lia_move tighten_terms_with_S () {
1389
1378
// Copy changed terms to another vector for sorting
1390
1379
std_vector<unsigned > sorted_changed_terms;
1380
+ std_vector<unsigned > processed_terms;
1391
1381
m_tightened_columns.reset ();
1392
- for (unsigned j = 0 ; j < m_changed_terms.size (); j++) {
1393
- if (m_changed_terms[j] == term_status::no_change) continue ;
1382
+ for (unsigned j: m_terms_to_tighten) {
1394
1383
if (j >= lra.column_count () ||
1395
1384
!lra.column_has_term (j) ||
1396
1385
lra.column_is_free (j) ||
1397
1386
!lia.column_is_int (j)) {
1398
- unmark_changed_term (j);
1387
+ processed_terms. push_back (j);
1399
1388
continue ;
1400
1389
}
1401
1390
sorted_changed_terms.push_back (j);
@@ -1414,19 +1403,18 @@ namespace lp {
1414
1403
// print_bounds(tout);
1415
1404
);
1416
1405
for (unsigned j : sorted_changed_terms) {
1417
- unmark_changed_term (j);
1406
+ m_terms_to_tighten. remove (j);
1418
1407
r = tighten_bounds_for_term_column (j);
1419
1408
if (r != lia_move::undef) {
1420
1409
break ;
1421
1410
}
1422
1411
}
1412
+ for (unsigned j :processed_terms) {
1413
+ m_terms_to_tighten.remove (j);
1414
+ }
1423
1415
return r;
1424
1416
}
1425
1417
1426
- void unmark_changed_term (unsigned j) {
1427
- m_changed_terms[j] = term_status::no_change;
1428
- }
1429
-
1430
1418
term_o create_term_from_espace () const {
1431
1419
term_o t;
1432
1420
for (const auto & p : m_espace.m_data ) {
@@ -1438,7 +1426,7 @@ namespace lp {
1438
1426
1439
1427
// We will have lar_t, and let j is lar_t.j(), the term column.
1440
1428
// In the m_espace we have lar_t. The result of open_ml((1*j)) is lar_t - (1, j).
1441
- // So we have "equality" m_espace = open(m_lspace) + (1*lar_t.j.
1429
+ // So we have "equality" m_espace = open(m_lspace) + (1*lar_t.j())
1442
1430
void init_substitutions (const lar_term& lar_t , protected_queue& q) {
1443
1431
m_espace.clear ();
1444
1432
m_c = mpq (0 );
0 commit comments