@@ -39,14 +39,15 @@ void HighsCallback::clearHighsCallbackOutput() {
3939}
4040
4141void HighsCallback::clearHighsCallbackInput () {
42- this -> data_in . user_interrupt = false ;
42+ size_t num_col = highs != nullptr ? highs-> getNumCol () : 0 ;
4343
4444 // make sure buffer size is correct and reset the contents if previously used
4545 if (this ->data_in .user_has_solution ||
46- highs-> getNumCol () != this ->data_in .user_solution .size ()) {
47- this ->data_in .user_solution .assign (highs-> getNumCol () , kHighsUndefined );
46+ num_col != this ->data_in .user_solution .size ()) {
47+ this ->data_in .user_solution .assign (num_col , kHighsUndefined );
4848 }
4949
50+ this ->data_in .user_interrupt = false ;
5051 this ->data_in .user_has_solution = false ;
5152}
5253
@@ -261,17 +262,24 @@ HighsStatus HighsCallbackInput::repairSolution() {
261262 }
262263
263264 // set callback to stop at first feasible solution
265+ bool user_interrupt = false ;
266+
264267 HighsCallbackFunctionType mip_callback =
265- [](int callback_type, const std::string& message,
266- const HighsCallbackOutput* data_out, HighsCallbackInput* data_in,
267- void * user_callback_data) {
268+ [& ](int callback_type, const std::string& message,
269+ const HighsCallbackOutput* data_out, HighsCallbackInput* data_in,
270+ void * user_callback_data) {
268271 if (callback_type == kCallbackMipSolution ) {
269- data_in->user_interrupt = true ;
272+ user_interrupt = true ;
273+ } else {
274+ data_in->user_interrupt = user_interrupt;
270275 }
271276 };
272277
273278 clone.setCallback (mip_callback);
274279 clone.startCallback (kCallbackMipSolution );
280+ clone.startCallback (kCallbackMipInterrupt );
281+ clone.startCallback (kCallbackSimplexInterrupt );
282+ clone.startCallback (kCallbackIpmInterrupt );
275283 clone.run ();
276284
277285 auto status = clone.getModelStatus ();
0 commit comments