@@ -62,7 +62,8 @@ static cupdlpx_result_t *create_result_from_state(pdhg_solver_state_t *state, co
6262static void perform_restart (pdhg_solver_state_t *state, const pdhg_parameters_t *params);
6363static void initialize_step_size_and_primal_weight (pdhg_solver_state_t *state, const pdhg_parameters_t *params);
6464static pdhg_solver_state_t *initialize_solver_state (const lp_problem_t *working_problem,
65- const pdhg_parameters_t *params);
65+ const pdhg_parameters_t *params,
66+ objective_sense_t original_objective_sense);
6667static void compute_fixed_point_error (pdhg_solver_state_t *state);
6768void pdhg_solver_state_free (pdhg_solver_state_t *state);
6869void rescale_info_free (rescale_info_t *info);
@@ -127,28 +128,33 @@ static void sync_step_sizes_to_gpu(pdhg_solver_state_t *state);
127128void sync_inner_count_to_gpu (pdhg_solver_state_t *state);
128129static void check_params_validity (const pdhg_parameters_t *params);
129130
130- cupdlpx_result_t *optimize (const pdhg_parameters_t *params, lp_problem_t *original_problem)
131+ cupdlpx_result_t *optimize (const pdhg_parameters_t *params, const lp_problem_t *original_problem)
131132{
132133 check_params_validity (params);
134+
133135 print_initial_info (params, original_problem);
134136
135- cupdlpx_presolve_info_t *presolve_info = NULL ;
136- const lp_problem_t *working_problem = original_problem ;
137+ lp_problem_t preprocessed_problem = preprocess_problem (original_problem, params) ;
138+ const lp_problem_t *working_problem = &preprocessed_problem ;
137139
140+ cupdlpx_presolve_info_t *presolve_info = NULL ;
138141 if (params->presolve )
139142 {
140- presolve_info = pslp_presolve (original_problem , params);
143+ presolve_info = pslp_presolve (&preprocessed_problem , params);
141144 if (presolve_info->problem_solved_during_presolve )
142145 {
143- cupdlpx_result_t *result = create_result_from_presolve (presolve_info, original_problem );
146+ cupdlpx_result_t *result = create_result_from_presolve (presolve_info, &preprocessed_problem );
144147 cupdlpx_presolve_info_free (presolve_info);
148+ restore_original_objective_sense (result, original_problem->objective_sense );
145149 pdhg_final_log (result, params);
150+ free_preprocessed_problem (&preprocessed_problem, original_problem);
146151 return result;
147152 }
148153 working_problem = presolve_info->reduced_problem ;
149154 }
150155
151- pdhg_solver_state_t *state = initialize_solver_state (working_problem, params);
156+ pdhg_solver_state_t *state =
157+ initialize_solver_state (working_problem, params, original_problem->objective_sense );
152158 display_iteration_stats (state, params->verbose );
153159
154160 initialize_step_size_and_primal_weight (state, params);
@@ -244,17 +250,20 @@ cupdlpx_result_t *optimize(const pdhg_parameters_t *params, lp_problem_t *origin
244250 feasibility_polish (params, state);
245251 }
246252
247- cupdlpx_result_t *result = create_result_from_state (state, original_problem );
253+ cupdlpx_result_t *result = create_result_from_state (state, &preprocessed_problem );
248254
249255 if (params->presolve && presolve_info)
250256 {
251- pslp_postsolve (presolve_info, result, original_problem );
257+ pslp_postsolve (presolve_info, result, &preprocessed_problem );
252258 cupdlpx_presolve_info_free (presolve_info);
253259 }
254260
255- pdhg_final_log (result, params);
256261 pdhg_solver_state_free (state);
257262 CUDA_CHECK (cudaGetLastError ());
263+
264+ restore_original_objective_sense (result, original_problem->objective_sense );
265+ pdhg_final_log (result, params);
266+ free_preprocessed_problem (&preprocessed_problem, original_problem);
258267 return result;
259268}
260269
@@ -314,7 +323,8 @@ __global__ void compute_and_rescale_reduced_cost_kernel(double *__restrict__ red
314323}
315324
316325static pdhg_solver_state_t *initialize_solver_state (const lp_problem_t *working_problem,
317- const pdhg_parameters_t *params)
326+ const pdhg_parameters_t *params,
327+ objective_sense_t original_objective_sense)
318328{
319329 pdhg_solver_state_t *state = (pdhg_solver_state_t *)safe_calloc (1 , sizeof (pdhg_solver_state_t ));
320330
@@ -327,7 +337,7 @@ static pdhg_solver_state_t *initialize_solver_state(const lp_problem_t *working_
327337 state->num_variables = n_vars;
328338 state->num_constraints = n_cons;
329339 state->objective_constant = working_problem->objective_constant ;
330- state->objective_sign = (working_problem-> objective_sense == OBJECTIVE_SENSE_MAXIMIZE ) ? -1.0 : 1.0 ;
340+ state->original_objective_sign = (original_objective_sense == OBJECTIVE_SENSE_MAXIMIZE ) ? -1.0 : 1.0 ;
331341
332342 state->constraint_matrix = (cu_sparse_matrix_csr_t *)safe_malloc (sizeof (cu_sparse_matrix_csr_t ));
333343 state->constraint_matrix_t = (cu_sparse_matrix_csr_t *)safe_malloc (sizeof (cu_sparse_matrix_csr_t ));
@@ -1261,8 +1271,8 @@ static cupdlpx_result_t *create_result_from_state(pdhg_solver_state_t *state, co
12611271 results->cumulative_time_sec = state->cumulative_time_sec ;
12621272 results->relative_primal_residual = state->relative_primal_residual ;
12631273 results->relative_dual_residual = state->relative_dual_residual ;
1264- results->primal_objective_value = state->objective_sign * state-> primal_objective_value ;
1265- results->dual_objective_value = state->objective_sign * state-> dual_objective_value ;
1274+ results->primal_objective_value = state->primal_objective_value ;
1275+ results->dual_objective_value = state->dual_objective_value ;
12661276 results->objective_gap = state->objective_gap ;
12671277 results->relative_objective_gap = state->relative_objective_gap ;
12681278 results->max_primal_ray_infeasibility = state->max_primal_ray_infeasibility ;
0 commit comments