@@ -265,7 +265,6 @@ void getKktFailures(const HighsOptions& options, const HighsLp& lp,
265265 lower = lp.row_lower_ [iRow];
266266 upper = lp.row_upper_ [iRow];
267267 value = solution.row_value [iRow];
268- // @FlipRowDual -solution.row_dual[iRow]; became solution.row_dual[iRow];
269268 if (have_dual_solution) dual = solution.row_dual [iRow];
270269 if (have_basis) status = basis.row_status [iRow];
271270 integrality = HighsVarType::kContinuous ;
@@ -349,7 +348,6 @@ void getKktFailures(const HighsOptions& options, const HighsLp& lp,
349348 } else {
350349 primal_negative_sum[iRow] -= term;
351350 }
352- // @FlipRowDual += became -=
353351 if (have_dual_solution) {
354352 double term = -solution.row_dual [iRow] * Avalue;
355353 if (term > 0 ) {
@@ -362,45 +360,10 @@ void getKktFailures(const HighsOptions& options, const HighsLp& lp,
362360 }
363361 }
364362
365- if (have_dual_solution) {
366- // Determine the sum of complementarity violations
367- max_complementarity_violation = 0 ;
368- sum_complementarity_violations = 0 ;
369- double primal_residual = 0 ;
370- for (HighsInt iVar = 0 ; iVar < lp.num_col_ + lp.num_row_ ; iVar++) {
371- const bool is_col = iVar < lp.num_col_ ;
372- const HighsInt iRow = iVar - lp.num_col_ ;
373- const double primal =
374- is_col ? solution.col_value [iVar] : solution.row_value [iRow];
375- const double dual =
376- is_col ? solution.col_dual [iVar] : solution.row_dual [iRow];
377- const double lower = is_col ? lp.col_lower_ [iVar] : lp.row_lower_ [iRow];
378- const double upper = is_col ? lp.col_upper_ [iVar] : lp.row_upper_ [iRow];
379- if (lower <= -kHighsInf && upper >= kHighsInf ) {
380- // Free
381- primal_residual = 1 ;
382- } else {
383- const double mid = (lower + upper) * 0.5 ;
384- primal_residual = primal < mid ? std::fabs (lower - primal)
385- : std::fabs (upper - primal);
386- }
387- const double dual_residual = std::fabs (dual);
388- const double complementarity_violation = primal_residual * dual_residual;
389- sum_complementarity_violations += complementarity_violation;
390- max_complementarity_violation =
391- std::max (complementarity_violation, max_complementarity_violation);
392- }
393- double check_max_complementarity_violation;
394- double check_sum_complementarity_violations;
395- const bool have_values = getComplementarityViolations (
396- lp, solution, check_max_complementarity_violation,
397- check_sum_complementarity_violations);
398- assert (have_values);
399- assert (check_max_complementarity_violation ==
400- max_complementarity_violation);
401- assert (check_sum_complementarity_violations ==
402- sum_complementarity_violations);
403- }
363+ // Determine the sum of complementarity violations
364+ if (have_dual_solution)
365+ getComplementarityViolations (lp, solution, max_complementarity_violation,
366+ sum_complementarity_violations);
404367
405368 if (get_residuals) {
406369 const double large_residual_error = 1e-12 ;
@@ -582,8 +545,7 @@ bool getComplementarityViolations(const HighsLp& lp,
582545 const HighsSolution& solution,
583546 double & max_complementarity_violation,
584547 double & sum_complementarity_violations) {
585- max_complementarity_violation = kHighsIllegalComplementarityViolation ;
586- sum_complementarity_violations = kHighsIllegalComplementarityViolation ;
548+ assert (solution.dual_valid );
587549 if (!solution.dual_valid ) return false ;
588550
589551 max_complementarity_violation = 0 ;
@@ -840,10 +802,7 @@ HighsStatus ipxSolutionToHighsSolution(
840802 options.log_options , HighsLogType::kInfo ,
841803 " ipxSolutionToHighsSolution: Norm of delta row values is %10.4g\n " ,
842804 delta_norm);
843- const bool force_dual_feasibility = false ; // true;
844- const bool minimal_truncation = true ;
845- if (model_status == HighsModelStatus::kOptimal &&
846- (force_dual_feasibility || minimal_truncation)) {
805+ if (model_status == HighsModelStatus::kOptimal ) {
847806 double primal_truncation_norm = 0 ;
848807 double dual_truncation_norm = 0 ;
849808 double col_primal_truncation_norm = 0 ;
@@ -914,7 +873,7 @@ HighsStatus ipxSolutionToHighsSolution(
914873 // Continue if no dual infeasibility
915874 if (dual_infeasibility <= dual_feasibility_tolerance) continue ;
916875
917- if (residual < dual_infeasibility && !force_dual_feasibility ) {
876+ if (residual < dual_infeasibility) {
918877 /*
919878 // Residual is less than dual infeasibility, or not forcing
920879 // dual feasibility, so truncate value
@@ -1190,7 +1149,6 @@ HighsStatus ipxBasicSolutionToHighsBasicSolution(
11901149 double slack_value = ipx_col_value[ipx_slack];
11911150 double slack_dual = ipx_col_dual[ipx_slack];
11921151 double value = slack_value;
1193- // @FlipRowDual -slack_dual became slack_dual
11941152 double dual = slack_dual;
11951153 if (ipx_row_status[ipx_row] == ipx_basic) {
11961154 // Row is basic
@@ -1238,7 +1196,6 @@ HighsStatus ipxBasicSolutionToHighsBasicSolution(
12381196 assert (ipx_row_status[ipx_row] ==
12391197 -1 ); // const ipx::Int ipx_nonbasic_row = -1;
12401198 double value = rhs[ipx_row] - ipx_row_value[ipx_row];
1241- // @FlipRowDual -ipx_row_dual[ipx_row]; became ipx_row_dual[ipx_row];
12421199 double dual = ipx_row_dual[ipx_row];
12431200 if (constraint_type[ipx_row] == ' >' ) {
12441201 // Row is at its lower bound
0 commit comments