@@ -1367,20 +1367,10 @@ bool HighsMipSolverData::oneOptImprovement(std::vector<double>& sol,
13671367 double & solobj) {
13681368 bool success = false ;
13691369 for (const HighsInt col : integer_cols) {
1370- double max_movement = kHighsInf ;
1371- if (mipsolver.model_ ->col_cost_ [col] > 0 &&
1372- sol[col] > domain.col_lower_ [col] + feastol) {
1373- max_movement = 0 ;
1374- } else if (mipsolver.model_ ->col_cost_ [col] < 0 &&
1375- sol[col] < domain.col_upper_ [col] - feastol) {
1376- max_movement = 0 ;
1377- } else if (mipsolver.model_ ->col_cost_ [col] == 0 ) {
1378- max_movement = 0 ;
1379- }
1380- if (max_movement == 0 ) continue ;
1370+ if (mipsolver.model_ ->col_cost_ [col] == 0 ) continue ;
13811371 HighsInt dir = mipsolver.model_ ->col_cost_ [col] > 0 ? 1 : -1 ;
1382- max_movement = dir == 1 ? sol[col] - domain.col_lower_ [col]
1383- : domain.col_upper_ [col] - sol[col];
1372+ double max_movement = dir == 1 ? sol[col] - domain.col_lower_ [col]
1373+ : domain.col_upper_ [col] - sol[col];
13841374 if (max_movement < 1 - feastol) continue ;
13851375 const HighsInt start = mipsolver.model_ ->a_matrix_ .start_ [col];
13861376 const HighsInt end = mipsolver.model_ ->a_matrix_ .start_ [col + 1 ];
@@ -1435,18 +1425,22 @@ bool HighsMipSolverData::oneOptImprovement(std::vector<double>& sol,
14351425 max_movement = 0 ;
14361426 }
14371427 }
1438- // Only move by integer amounts
1439- max_movement = floor (max_movement + feastol);
1440- if (max_movement <= 0 ) {
1428+ if (max_movement < 1 - feastol) {
14411429 break ;
14421430 }
14431431 }
1444- if (max_movement >= 1 ) {
1432+ if (max_movement >= 1 - feastol) {
1433+ if (max_movement >= kHighsInf ) {
1434+ // instance is unbounded
1435+ printf (" ONEOPT IS UNBOUNDED!!\n " );
1436+ return false ;
1437+ }
14451438 sol[col] -= dir * max_movement;
14461439 success = true ;
14471440 }
14481441 }
14491442 if (success) {
1443+ printf (" ONEOPT DID SOMETHING!!!!\n " );
14501444 solobj = transformNewIntegerFeasibleSolution (sol, true );
14511445 }
14521446 return success;
@@ -1480,7 +1474,14 @@ bool HighsMipSolverData::addIncumbent(const std::vector<double>& sol,
14801474 bool one_opt_success = false ;
14811475 double one_opt_transformed_solobj = transformed_solobj;
14821476 std::vector<double > one_opt_sol;
1483- if (possibly_store_as_new_incumbent && transformed_solobj != kHighsInf ) {
1477+ if (possibly_store_as_new_incumbent && transformed_solobj != kHighsInf &&
1478+ (solution_source == kSolutionSourceRandomizedRounding ||
1479+ solution_source == kSolutionSourceFeasibilityJump ||
1480+ solution_source == kSolutionSourceTrivialZ ||
1481+ solution_source == kSolutionSourceTrivialL ||
1482+ solution_source == kSolutionSourceTrivialU ||
1483+ solution_source == kSolutionSourceTrivialP ||
1484+ solution_source == kSolutionSourceCentralRounding )) {
14841485 one_opt_sol = sol;
14851486 one_opt_success =
14861487 oneOptImprovement (one_opt_sol, one_opt_transformed_solobj);
0 commit comments