@@ -356,11 +356,16 @@ void set_presolve_options(papilo::Presolve<f_t>& presolver,
356356 f_t absolute_tolerance,
357357 f_t relative_tolerance,
358358 double time_limit,
359+ bool dual_postsolve,
359360 i_t num_cpu_threads)
360361{
361362 presolver.getPresolveOptions ().tlim = time_limit;
362363 presolver.getPresolveOptions ().threads = num_cpu_threads; // user setting or 0 (automatic)
363364 presolver.getPresolveOptions ().feastol = 1e-5 ;
365+ if (dual_postsolve) {
366+ presolver.getPresolveOptions ().componentsmaxint = -1 ;
367+ presolver.getPresolveOptions ().detectlindep = 0 ;
368+ }
364369}
365370
366371template <typename f_t >
@@ -404,8 +409,13 @@ std::optional<third_party_presolve_result_t<i_t, f_t>> third_party_presolve_t<i_
404409 if (category == problem_category_t ::MIP) { dual_postsolve = false ; }
405410 papilo::Presolve<f_t > presolver;
406411 set_presolve_methods<f_t >(presolver, category, dual_postsolve);
407- set_presolve_options<i_t , f_t >(
408- presolver, category, absolute_tolerance, relative_tolerance, time_limit, num_cpu_threads);
412+ set_presolve_options<i_t , f_t >(presolver,
413+ category,
414+ absolute_tolerance,
415+ relative_tolerance,
416+ time_limit,
417+ dual_postsolve,
418+ num_cpu_threads);
409419 set_presolve_parameters<f_t >(
410420 presolver, category, op_problem.get_n_constraints (), op_problem.get_n_variables ());
411421
@@ -446,6 +456,7 @@ void third_party_presolve_t<i_t, f_t>::undo(rmm::device_uvector<f_t>& primal_sol
446456 rmm::device_uvector<f_t >& reduced_costs,
447457 problem_category_t category,
448458 bool status_to_skip,
459+ bool dual_postsolve,
449460 rmm::cuda_stream_view stream_view)
450461{
451462 if (status_to_skip) { return ; }
@@ -455,8 +466,12 @@ void third_party_presolve_t<i_t, f_t>::undo(rmm::device_uvector<f_t>& primal_sol
455466 raft::copy (dual_sol_vec_h.data (), dual_solution.data (), dual_solution.size (), stream_view);
456467 std::vector<f_t > reduced_costs_vec_h (reduced_costs.size ());
457468 raft::copy (reduced_costs_vec_h.data (), reduced_costs.data (), reduced_costs.size (), stream_view);
458-
459469 papilo::Solution<f_t > reduced_sol (primal_sol_vec_h);
470+ if (dual_postsolve) {
471+ reduced_sol.dual = dual_sol_vec_h;
472+ reduced_sol.reducedCosts = reduced_costs_vec_h;
473+ reduced_sol.type = papilo::SolutionType::kPrimalDual ;
474+ }
460475 papilo::Solution<f_t > full_sol;
461476
462477 papilo::Message Msg{};
0 commit comments