@@ -1492,6 +1492,8 @@ void HPresolve::createPrecedenceGraph(bool generateUb) const {
14921492 if (precedenceArcs.empty ()) {
14931493 precedenceLb.clear ();
14941494 implications.getPrecedenceDirectedGraphUb ().clear ();
1495+ implications.getPrecedenceLbSource ().clear ();
1496+ implications.getPrecedenceUbSource ().clear ();
14951497 return ;
14961498 }
14971499
@@ -1508,6 +1510,9 @@ void HPresolve::createPrecedenceGraph(bool generateUb) const {
15081510 }
15091511 index.resize (start.back ());
15101512 value.resize (start.back ());
1513+ std::vector<std::pair<HighsInt, bool >>& precedenceLbReason =
1514+ implications.getPrecedenceLbSource ();
1515+ precedenceLbReason.resize (start.back ());
15111516 std::vector<HighsInt> pos = start;
15121517 for (const HighsInt row : precedenceArcs) {
15131518 HighsInt x = -1 ;
@@ -1528,16 +1533,55 @@ void HPresolve::createPrecedenceGraph(bool generateUb) const {
15281533 const HighsInt p = pos[x]++;
15291534 index[p] = y;
15301535 value[p] = model->row_upper_ [row] / scale;
1536+ precedenceLbReason[p] = {row, true };
15311537 }
15321538 if (model->row_lower_ [row] != -kHighsInf ) {
15331539 const HighsInt p = pos[y]++;
15341540 index[p] = x;
15351541 value[p] = -model->row_lower_ [row] / scale;
1542+ precedenceLbReason[p] = {row, false };
15361543 }
15371544 }
15381545
15391546 if (generateUb) {
1540- implications.getPrecedenceDirectedGraphUb ().createRowwise (precedenceLb);
1547+ HighsSparseMatrix& precedenceUb =
1548+ implications.getPrecedenceDirectedGraphUb ();
1549+ precedenceUb.num_col_ = mipsolver->numCol ();
1550+ precedenceUb.num_row_ = mipsolver->numCol ();
1551+ precedenceUb.p_end_ .clear ();
1552+ std::vector<std::pair<HighsInt, bool >>& precedenceUbReason =
1553+ implications.getPrecedenceUbSource ();
1554+ precedenceUbReason.resize (start.back ());
1555+
1556+ vector<HighsInt>& u_start = precedenceUb.start_ ;
1557+ vector<HighsInt>& u_index = precedenceUb.index_ ;
1558+ vector<double >& u_value = precedenceUb.value_ ;
1559+
1560+ std::vector<HighsInt> u_end;
1561+ u_start.resize (mipsolver->numCol () + 1 );
1562+ u_end.assign (mipsolver->numCol (), 0 );
1563+ for (HighsInt col = 0 ; col < mipsolver->numCol (); col++) {
1564+ for (HighsInt i = start[col]; i < start[col + 1 ]; i++) {
1565+ const HighsInt col2 = index[i];
1566+ u_end[col2]++;
1567+ }
1568+ }
1569+ u_start[0 ] = 0 ;
1570+ for (HighsInt col = 0 ; col < mipsolver->numCol (); col++) {
1571+ u_start[col + 1 ] = u_start[col] + u_end[col];
1572+ u_end[col] = u_start[col];
1573+ }
1574+ u_index.resize (start.back ());
1575+ u_value.resize (start.back ());
1576+ for (HighsInt col = 0 ; col < mipsolver->numCol (); col++) {
1577+ for (HighsInt i = start[col]; i < start[col + 1 ]; i++) {
1578+ const HighsInt col2 = index[i];
1579+ HighsInt j = u_end[col2]++;
1580+ u_index[j] = col;
1581+ u_value[j] = value[i];
1582+ precedenceUbReason[j] = precedenceLbReason[i];
1583+ }
1584+ }
15411585 }
15421586}
15431587
0 commit comments