@@ -2959,21 +2959,52 @@ bool isMatrixDataNull(const HighsLogOptions& log_options,
29592959}
29602960
29612961void reportPresolveReductions (const HighsLogOptions& log_options,
2962- const HighsLp& lp, const HighsLp& presolve_lp) {
2963- HighsInt num_col_from = lp.num_col_ ;
2964- HighsInt num_row_from = lp.num_row_ ;
2965- HighsInt num_nz_from = lp.a_matrix_ .start_ [num_col_from];
2966- HighsInt num_col_to = presolve_lp.num_col_ ;
2967- HighsInt num_row_to = presolve_lp.num_row_ ;
2968- HighsInt num_nz_to;
2969- if (num_col_to) {
2970- num_nz_to = presolve_lp.a_matrix_ .start_ [num_col_to];
2971- } else {
2972- num_nz_to = 0 ;
2962+ HighsPresolveStatus presolve_status,
2963+ const HighsLp& lp,
2964+ const HighsLp& presolved_lp) {
2965+ const HighsInt num_col_from = lp.num_col_ ;
2966+ const HighsInt num_row_from = lp.num_row_ ;
2967+ const HighsInt num_nz_from = lp.a_matrix_ .numNz ();
2968+ HighsInt num_col_to = 0 ;
2969+ HighsInt num_row_to = 0 ;
2970+ HighsInt num_nz_to = 0 ;
2971+ std::string message = " " ;
2972+
2973+ switch (presolve_status) {
2974+ case HighsPresolveStatus::kNotPresolved :
2975+ case HighsPresolveStatus::kInfeasible :
2976+ case HighsPresolveStatus::kUnboundedOrInfeasible : return ;
2977+ case HighsPresolveStatus::kNotReduced : {
2978+ num_col_to = num_col_from;
2979+ num_row_to = num_row_from;
2980+ num_nz_to = num_nz_from;
2981+ message = " - Not reduced" ;
2982+ break ;
2983+ }
2984+ case HighsPresolveStatus::kReduced :
2985+ case HighsPresolveStatus::kTimeout : {
2986+ num_col_to = presolved_lp.num_col_ ;
2987+ num_row_to = presolved_lp.num_row_ ;
2988+ num_nz_to = presolved_lp.a_matrix_ .numNz ();
2989+ message = presolve_status == HighsPresolveStatus::kTimeout ? " - Timeout" : " " ;
2990+ break ;
2991+ }
2992+ case HighsPresolveStatus::kReducedToEmpty : {
2993+ num_col_to = 0 ;
2994+ num_row_to = 0 ;
2995+ num_nz_to = 0 ;
2996+ message = " - Reduced to empty" ;
2997+ break ;
2998+ }
2999+ default : {
3000+ // case HighsPresolveStatus::kOutOfMemory
3001+ assert (presolve_status == HighsPresolveStatus::kOutOfMemory );
3002+ return ;
3003+ }
29733004 }
29743005 char nz_sign_char = ' -' ;
29753006 HighsInt delta_nz = num_nz_from - num_nz_to;
2976- if (num_nz_from < num_nz_to ) {
3007+ if (num_nz_to > num_nz_from ) {
29773008 delta_nz = -delta_nz;
29783009 nz_sign_char = ' +' ;
29793010 }
@@ -2982,40 +3013,9 @@ void reportPresolveReductions(const HighsLogOptions& log_options,
29823013 " Presolve reductions: rows %" HIGHSINT_FORMAT " (-%" HIGHSINT_FORMAT
29833014 " ); columns %" HIGHSINT_FORMAT " (-%" HIGHSINT_FORMAT
29843015 " ); "
2985- " nonzeros %" HIGHSINT_FORMAT " (%c%" HIGHSINT_FORMAT " )\n " ,
3016+ " nonzeros %" HIGHSINT_FORMAT " (%c%" HIGHSINT_FORMAT " ) %s \n " ,
29863017 num_row_to, (num_row_from - num_row_to), num_col_to,
2987- (num_col_from - num_col_to), num_nz_to, nz_sign_char, delta_nz);
2988- }
2989-
2990- void reportPresolveReductions (const HighsLogOptions& log_options,
2991- const HighsLp& lp, const bool presolve_to_empty) {
2992- HighsInt num_col_from = lp.num_col_ ;
2993- HighsInt num_row_from = lp.num_row_ ;
2994- HighsInt num_nz_from = lp.a_matrix_ .start_ [num_col_from];
2995- HighsInt num_col_to;
2996- HighsInt num_row_to;
2997- HighsInt num_nz_to;
2998- std::string message;
2999- if (presolve_to_empty) {
3000- num_col_to = 0 ;
3001- num_row_to = 0 ;
3002- num_nz_to = 0 ;
3003- message = " - Reduced to empty" ;
3004- } else {
3005- num_col_to = num_col_from;
3006- num_row_to = num_row_from;
3007- num_nz_to = num_nz_from;
3008- message = " - Not reduced" ;
3009- }
3010- highsLogUser (log_options, HighsLogType::kInfo ,
3011- " Presolve reductions: rows %" HIGHSINT_FORMAT
3012- " (-%" HIGHSINT_FORMAT " ); columns %" HIGHSINT_FORMAT
3013- " (-%" HIGHSINT_FORMAT
3014- " ); "
3015- " nonzeros %" HIGHSINT_FORMAT " (-%" HIGHSINT_FORMAT " ) %s\n " ,
3016- num_row_to, (num_row_from - num_row_to), num_col_to,
3017- (num_col_from - num_col_to), num_nz_to,
3018- (num_nz_from - num_nz_to), message.c_str ());
3018+ (num_col_from - num_col_to), num_nz_to, nz_sign_char, delta_nz, message.c_str ());
30193019}
30203020
30213021bool isLessInfeasibleDSECandidate (const HighsLogOptions& log_options,
@@ -3212,6 +3212,10 @@ HighsLp withoutSemiVariables(const HighsLp& lp_, HighsSolution& solution,
32123212 lp.num_col_ += num_semi_variables;
32133213 lp.num_row_ += 2 * num_semi_variables;
32143214 assert ((HighsInt)index.size () == new_num_nz);
3215+ // Ensure that the matrix dimensions are consistent with the LP
3216+ // dimensions
3217+ lp.a_matrix_ .num_col_ = lp.num_col_ ;
3218+ lp.a_matrix_ .num_row_ = lp.num_row_ ;
32153219 // Clear any modifications inherited from lp_
32163220 lp.mods_ .clear ();
32173221 return lp;
0 commit comments