@@ -142,6 +142,9 @@ bool HighsPrimalHeuristics::solveSubMip(
142142 mipsolver.analysis_ .mipTimerStart (kMipClockSubMipSolve );
143143 HighsMipSolver submipsolver (*mipsolver.callback_ , submipoptions, submip,
144144 solution, true , mipsolver.submip_level + 1 );
145+ // Initialise termination_status_ and propagate any terminator to
146+ // the sub-MIP
147+ submipsolver.initialiseTerminator (mipsolver);
145148 submipsolver.rootbasis = &basis;
146149 HighsPseudocostInitialization pscostinit (mipsolver.mipdata_ ->pseudocost , 1 );
147150 submipsolver.pscostinit = &pscostinit;
@@ -152,6 +155,21 @@ bool HighsPrimalHeuristics::solveSubMip(
152155 mipsolver.max_submip_level =
153156 std::max (submipsolver.max_submip_level + 1 , mipsolver.max_submip_level );
154157 if (!mipsolver.submip ) mipsolver.analysis_ .mipTimerStop (kMipClockSubMipSolve );
158+ // 22/07/25: Seems impossible for submipsolver.mipdata_ to be a null
159+ // pointer after calling HighsMipSolver::run(), and assert isn't
160+ // triggered for anything in ctest, but use direct test of
161+ // submipsolver.termination_status_, rather than
162+ // submipsolver.mipdata_.terminatorTerminated()
163+ if (!submipsolver.mipdata_ ) {
164+ printf (" HighsPrimalHeuristics::solveSubMip: submipsolver.mipdata_ is nullptr\n " );
165+ assert (submipsolver.mipdata_ );
166+ }
167+ if (submipsolver.termination_status_ != HighsModelStatus::kNotset ) {
168+ printf (" HighsPrimalHeuristics::solveSubMip: termination status is %d\n " , int (submipsolver.termination_status_ ));
169+ mipsolver.termination_status_ = submipsolver.termination_status_ ;
170+ assert (111 ==333 );
171+ return ;
172+ }
155173 if (submipsolver.mipdata_ ) {
156174 double numUnfixed = mipsolver.mipdata_ ->integral_cols .size () +
157175 mipsolver.mipdata_ ->continuous_cols .size ();
0 commit comments