@@ -183,11 +183,31 @@ void HighsMipSolver::run() {
183183 mipdata_->callbackUserSolution (solution_objective_,
184184 kUserMipSolutionCallbackOriginAfterSetup );
185185
186- const bool mip_heuristic_run_ines = false ;
186+ // Apply the trivial heuristics
187+ analysis_.mipTimerStart (kMipClockTrivialHeuristics );
188+ HighsModelStatus returned_model_status = mipdata_->trivialHeuristics ();
189+ analysis_.mipTimerStop (kMipClockTrivialHeuristics );
190+ if (modelstatus_ == HighsModelStatus::kNotset &&
191+ returned_model_status == HighsModelStatus::kInfeasible ) {
192+ // trivialHeuristics can spot trivial infeasibility, so act on it
193+ modelstatus_ = returned_model_status;
194+ cleanupSolve ();
195+ return ;
196+ }
197+
198+ // Don't report on this MIP type, or re-record the MIP
187199 const bool ines_silent = true ;
188200 if (mipdata_->mipIsInes (ines_silent)) {
189- if (mip_heuristic_run_ines) {
201+ assert (mipdata_->mipIsInesLookup ());
202+ if (options_mip_->mip_heuristic_run_ines ) {
203+ analysis_.mipTimerStart (kMipClockInes );
190204 HighsStatus ines_status = mipdata_->heuristics .mipHeuristicInes ();
205+ analysis_.mipTimerStop (kMipClockInes );
206+ if (ines_status == HighsStatus::kError ) {
207+ modelstatus_ = HighsModelStatus::kSolveError ;
208+ cleanupSolve ();
209+ return ;
210+ }
191211 }
192212 }
193213
@@ -203,25 +223,27 @@ void HighsMipSolver::run() {
203223 cleanupSolve ();
204224 return ;
205225 }
206- const bool bailout_after_feasibility_jump = false ;
207- if (bailout_after_feasibility_jump) {
208- highsLogUser (options_mip_->log_options , HighsLogType::kInfo ,
209- " HighsMipSolver: Bailing out after Feasibility Jump with "
210- " model status = %s\n " ,
211- utilModelStatusToString (returned_model_status).c_str ());
212- modelstatus_ = HighsModelStatus::kInterrupt ;
226+ if (returned_model_status == HighsModelStatus::kSolveError ) {
227+ modelstatus_ = returned_model_status;
213228 cleanupSolve ();
214229 return ;
215230 }
216231 }
217- // Apply the trivial heuristics
218- analysis_.mipTimerStart (kMipClockTrivialHeuristics );
219- HighsModelStatus returned_model_status = mipdata_->trivialHeuristics ();
220- analysis_.mipTimerStop (kMipClockTrivialHeuristics );
221- if (modelstatus_ == HighsModelStatus::kNotset &&
222- returned_model_status == HighsModelStatus::kInfeasible ) {
223- // trivialHeuristics can spot trivial infeasibility, so act on it
224- modelstatus_ = returned_model_status;
232+ if (!submip && mipdata_->mipIsInesLookup ()) {
233+ printf (" grepInesFJ,%s,%d,%d,%g,%d,%g,%g,%g,%g\n " ,
234+ model_->model_name_ .c_str (), int (model_->num_col_ ),
235+ int (model_->num_row_ ), model_->offset_ ,
236+ mipdata_->ines_zero_solution_ , mipdata_->ines_objective_ ,
237+ mipdata_->ines_time_ , mipdata_->feasibility_jump_objective_ ,
238+ mipdata_->feasibility_jump_time_ );
239+ }
240+ const bool bailout_after_feasibility_jump = false ;
241+ if (bailout_after_feasibility_jump) {
242+ highsLogUser (options_mip_->log_options , HighsLogType::kInfo ,
243+ " HighsMipSolver: Bailing out after Feasibility Jump with "
244+ " model status = %s\n " ,
245+ utilModelStatusToString (returned_model_status).c_str ());
246+ modelstatus_ = HighsModelStatus::kInterrupt ;
225247 cleanupSolve ();
226248 return ;
227249 }
0 commit comments