From 0907cc37ee05adaba934eb16cd80d886898be8f8 Mon Sep 17 00:00:00 2001 From: Federico Battista Date: Fri, 22 Nov 2024 10:57:08 -0500 Subject: [PATCH] Fix CLP termcode to LP_TIME_LIMIT only in the case a limit has been set --- SYMPHONY/src/LP/lp_solver.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/SYMPHONY/src/LP/lp_solver.c b/SYMPHONY/src/LP/lp_solver.c index 713033cf..b1e6385e 100644 --- a/SYMPHONY/src/LP/lp_solver.c +++ b/SYMPHONY/src/LP/lp_solver.c @@ -2599,10 +2599,14 @@ int initial_lp_solve (LPdata *lp_data, int *iterd) }else if (si->isIterationLimitReached()){ term = LP_D_ITLIM; #ifdef __OSI_CLP__ + double timelimit; + ClpDblParam key = ClpMaxWallSeconds; + lp_data->si->getModelPtr()->getDblParam(key, timelimit); // YX: reset term if needed; Clp may return ITLIM at timeout int itlim_chk = -1; retval = si->getIntParam(OsiMaxNumIteration, itlim_chk); - if (si->getIterationCount() < itlim_chk){ + // feb223: but check that a time limit has been actually set + if (timelimit > 0 && (si->getIterationCount() < itlim_chk)){ term = LP_TIME_LIMIT; } /* If max iterations and had switched to primal, bound is no good */ @@ -2722,12 +2726,16 @@ int dual_simplex(LPdata *lp_data, int *iterd) }else if (si->isIterationLimitReached()){ term = LP_D_ITLIM; #ifdef __OSI_CLP__ + double timelimit; + ClpDblParam key = ClpMaxWallSeconds; + lp_data->si->getModelPtr()->getDblParam(key, timelimit); // YX: reset term if needed; Clp may return ITLIM at timeout int itlim_chk = -1; retval = si->getIntParam(OsiMaxNumIteration, itlim_chk); - if (si->getIterationCount() < itlim_chk){ + // feb223: but check that a time limit has been actually set + if (timelimit > 0 && (si->getIterationCount() < itlim_chk)){ term = LP_TIME_LIMIT; - } + } /* If max iterations and had switched to primal, bound is no good */ if (si->getModelPtr()->secondaryStatus() == 10){ term = LP_ABANDONED; @@ -2835,10 +2843,14 @@ int solve_hotstart(LPdata *lp_data, int *iterd) else if (si->isIterationLimitReached()){ term = LP_D_ITLIM; #ifdef __OSI_CLP__ + double timelimit; + ClpDblParam key = ClpMaxWallSeconds; + lp_data->si->getModelPtr()->getDblParam(key, timelimit); // YX: reset term if needed; Clp may return ITLIM at timeout int itlim_chk = -1; retval = si->getIntParam(OsiMaxNumIteration, itlim_chk); - if (si->getIterationCount() < itlim_chk){ + // feb223: but check that a time limit has been actually set + if (timelimit > 0 && (si->getIterationCount() < itlim_chk)){ term = LP_TIME_LIMIT; } #endif