--- papilo-2.2.1/src/papilo/core/SparseStorage.hpp.orig 2024-06-07 12:08:24.746855040 -0600 +++ papilo-2.2.1/src/papilo/core/SparseStorage.hpp 2024-06-07 12:13:44.085783196 -0600 @@ -857,15 +857,15 @@ SparseStorage::shiftRows( const in // space } while( rowranges[l].start == rowranges[l - 1].end ); - REAL* valsout = &values[rowranges[l].start - lastshiftleft]; - int* colsout = &columns[rowranges[l].start - lastshiftleft]; + REAL* valsout = &values.data()[rowranges[l].start - lastshiftleft]; + int* colsout = &columns.data()[rowranges[l].start - lastshiftleft]; assert( rowranges[l - 1].end <= rowranges[l].start - lastshiftleft ); while( l <= row ) { - int shift = &values[rowranges[l].start] - valsout; + int shift = &values.data()[rowranges[l].start] - valsout; #ifndef NDEBUG Vec tmpvals; @@ -877,10 +877,10 @@ SparseStorage::shiftRows( const in #endif if( rowranges[l].start != rowranges[l].end ) { - valsout = std::move( &values[rowranges[l].start], - &values[rowranges[l].end], valsout ); - colsout = std::move( &columns[rowranges[l].start], - &columns[rowranges[l].end], colsout ); + valsout = std::move( &values.data()[rowranges[l].start], + &values.data()[rowranges[l].end], valsout ); + colsout = std::move( &columns.data()[rowranges[l].start], + &columns.data()[rowranges[l].end], colsout ); } rowranges[l].start -= shift; @@ -907,15 +907,15 @@ SparseStorage::shiftRows( const in // space } while( rowranges[r].end == rowranges[r + 1].start ); - REAL* valsout = &values[rowranges[r].end + lastshiftright]; - int* colsout = &columns[rowranges[r].end + lastshiftright]; + REAL* valsout = &values.data()[rowranges[r].end + lastshiftright]; + int* colsout = &columns.data()[rowranges[r].end + lastshiftright]; assert( rowranges[r + 1].start >= rowranges[r].end + lastshiftright ); while( r > row ) { - int shift = valsout - &values[rowranges[r].end]; + int shift = valsout - &values.data()[rowranges[r].end]; #ifndef NDEBUG Vec tmpvals; @@ -928,11 +928,11 @@ SparseStorage::shiftRows( const in if( rowranges[r].start != rowranges[r].end ) { valsout = - std::move_backward( &values[rowranges[r].start], - &values[rowranges[r].end], valsout ); + std::move_backward( &values.data()[rowranges[r].start], + &values.data()[rowranges[r].end], valsout ); colsout = - std::move_backward( &columns[rowranges[r].start], - &columns[rowranges[r].end], colsout ); + std::move_backward( &columns.data()[rowranges[r].start], + &columns.data()[rowranges[r].end], colsout ); } rowranges[r].start += shift; --- papilo-2.2.1/src/papilo/presolvers/ParallelColDetection.hpp.orig 2024-06-07 12:08:24.747855027 -0600 +++ papilo-2.2.1/src/papilo/presolvers/ParallelColDetection.hpp 2024-06-07 12:16:57.755305982 -0600 @@ -598,13 +598,16 @@ ParallelColDetection::execute( con if( flag_a_integer != flag_b_integer ) return !flag_a_integer; + SparseVectorView coeffs_a = constMatrix.getColumnCoefficients( a ); + SparseVectorView coeffs_b = constMatrix.getColumnCoefficients( b ); + REAL coeff_a = (coeffs_a.getLength() > 0) ? coeffs_a.getValues()[0] : (REAL)0; + REAL coeff_b = (coeffs_b.getLength() > 0) ? coeffs_b.getValues()[0] : (REAL)0; return // sort by scale factor abs( obj[a] ) < abs( obj[b] ) || // sort by scale factor if obj is zero ( abs( obj[a] ) == abs( obj[b] ) && obj[a] == 0 && determineOderingForZeroObj( - constMatrix.getColumnCoefficients( a ).getValues()[0], - constMatrix.getColumnCoefficients( b ).getValues()[0], + coeff_a, coeff_b, colperm[a], colperm[b] ) ) || // sort by permutation ( abs( obj[a] ) == abs( obj[b] ) && obj[a] != 0 &&