@@ -1056,18 +1056,31 @@ HighsStatus applyScalingToLpRow(HighsLp& lp, const HighsInt row,
10561056
10571057void simplexUnscaleSolution (HighsSolution& solution, const HighsScale& scale) {
10581058 assert (scale.has_scaling );
1059- assert (solution.col_value .size () == static_cast <size_t >(scale.num_col ));
1060- assert (solution.col_dual .size () == static_cast <size_t >(scale.num_col ));
1061- assert (solution.row_value .size () == static_cast <size_t >(scale.num_row ));
1062- assert (solution.row_dual .size () == static_cast <size_t >(scale.num_row ));
1063-
1064- for (HighsInt iCol = 0 ; iCol < scale.num_col ; iCol++) {
1065- solution.col_value [iCol] *= scale.col [iCol];
1066- solution.col_dual [iCol] /= (scale.col [iCol] / scale.cost );
1067- }
1068- for (HighsInt iRow = 0 ; iRow < scale.num_row ; iRow++) {
1069- solution.row_value [iRow] /= scale.row [iRow];
1070- solution.row_dual [iRow] *= (scale.row [iRow] * scale.cost );
1059+ const bool has_cost_scaling = scale.cost > 1.0 ;
1060+ const bool has_matrix_scaling = scale.col .size () && scale.row .size ();
1061+ assert (has_cost_scaling || has_matrix_scaling);
1062+ HighsInt num_col = solution.col_value .size ();
1063+ HighsInt num_row = solution.row_value .size ();
1064+ if (has_matrix_scaling) {
1065+ assert (scale.num_col == num_col);
1066+ assert (scale.num_row == num_row);
1067+ assert (solution.col_value .size () == scale.col .size ());
1068+ assert (solution.row_value .size () == scale.row .size ());
1069+ assert (solution.col_dual .size () == scale.col .size ());
1070+ assert (solution.row_dual .size () == scale.row .size ());
1071+ for (HighsInt iCol = 0 ; iCol < num_col; iCol++) {
1072+ solution.col_value [iCol] *= scale.col [iCol];
1073+ solution.col_dual [iCol] /= (scale.col [iCol] / scale.cost );
1074+ }
1075+ for (HighsInt iRow = 0 ; iRow < num_row; iRow++) {
1076+ solution.row_value [iRow] /= scale.row [iRow];
1077+ solution.row_dual [iRow] *= (scale.row [iRow] * scale.cost );
1078+ }
1079+ } else {
1080+ for (HighsInt iCol = 0 ; iCol < num_col; iCol++)
1081+ solution.col_dual [iCol] *= scale.cost ;
1082+ for (HighsInt iRow = 0 ; iRow < num_row; iRow++)
1083+ solution.row_dual [iRow] *= scale.cost ;
10711084 }
10721085}
10731086
@@ -1095,6 +1108,7 @@ void simplexScaleCost(const HighsOptions& options, HighsLp& lp) {
10951108 cost_scale = pow (2.0 , floor (log (cost_scale) / log (2.0 ) + 0.5 ));
10961109 cost_scale = min (cost_scale, max_allowed_cost_scale);
10971110 }
1111+ assert (cost_scale >= 1.0 );
10981112 if (cost_scale == 1.0 ) {
10991113 highsLogDev (options.log_options , HighsLogType::kInfo ,
11001114 " LP cost vector not scaled down: max cost is %g\n " ,
0 commit comments