@@ -57,10 +57,11 @@ template <typename f_t>
5757static void invoke_solution_callbacks (
5858 const std::vector<internals::base_solution_callback_t *>& mip_callbacks,
5959 f_t objective,
60- std::vector<f_t >& assignment)
60+ std::vector<f_t >& assignment,
61+ f_t bound)
6162{
6263 std::vector<f_t > obj_vec = {objective};
63- std::vector<f_t > bound_vec = {std::numeric_limits< f_t >:: infinity () };
64+ std::vector<f_t > bound_vec = {bound };
6465 for (auto callback : mip_callbacks) {
6566 if (callback != nullptr &&
6667 callback->get_type () == internals::base_solution_callback_type::GET_SOLUTION ) {
@@ -313,16 +314,18 @@ mip_solution_t<i_t, f_t> solve_mip(optimization_problem_t<i_t, f_t>& op_problem,
313314
314315 bool run_early_fj = run_presolve && settings.determinism_mode != CUOPT_MODE_DETERMINISTIC &&
315316 op_problem.get_n_integers () > 0 ;
317+ f_t no_bound = problem.presolve_data .objective_scaling_factor >= 0 ? (f_t )-1e20 : (f_t )1e20 ;
316318 if (run_early_fj) {
317319 auto early_fj_callback = [&early_best_objective,
318320 &early_callback_mutex,
319- mip_callbacks = settings.get_mip_callbacks ()](
320- f_t objective, const std::vector<f_t >& assignment) {
321+ mip_callbacks = settings.get_mip_callbacks (),
322+ no_bound](
323+ f_t solver_obj, f_t user_obj, const std::vector<f_t >& assignment) {
321324 std::lock_guard<std::mutex> lock (early_callback_mutex);
322- if (objective >= early_best_objective.load ()) { return ; }
323- early_best_objective.store (objective );
325+ if (solver_obj >= early_best_objective.load ()) { return ; }
326+ early_best_objective.store (solver_obj );
324327 auto user_assignment = assignment;
325- invoke_solution_callbacks (mip_callbacks, objective , user_assignment);
328+ invoke_solution_callbacks (mip_callbacks, user_obj , user_assignment, no_bound );
326329 };
327330
328331 // Start early CPUFJ on original problem (will restart on presolved problem after Papilo)
0 commit comments