#include #include #include void mip_to_soln(LPX * lp) { unsigned n = lpx_get_num_rows(lp); unsigned m = lpx_get_num_cols(lp); int p_stat = lpx_get_prim_stat(lp); int d_stat = lpx_get_dual_stat(lp); double rows[n+1]; double cols[m+1]; int i,j; for(i=1; i<=n; i++) rows[i] = rint(lpx_mip_row_val(lp, i)); for(j=1; j<=m; j++) cols[i] = rint(lpx_mip_col_val(lp, j)); lpx_put_solution(lp, p_stat, d_stat, NULL, rows, NULL, NULL, cols, NULL); } void soln_to_mip(LPX * lp) { unsigned n = lpx_get_num_rows(lp); unsigned m = lpx_get_num_cols(lp); int stat = lpx_get_mip_stat(lp); double rows[n+1]; double cols[m+1]; int i,j; for(i=1; i<=n; i++) rows[i] = lpx_get_row_prim(lp, i); for(j=1; j<=m; j++) cols[i] = lpx_get_col_prim(lp, j); lpx_put_mip_soln(lp, stat, rows, cols); } int main() { LPX * orig = lpx_read_model("bpp25.mod", NULL, NULL); lpx_set_int_parm(orig, LPX_K_PRESOL, 0); lpx_set_class(orig, LPX_MIP); LPP * lpp = lpp_create_wksp(); lpp_load_orig(lpp, orig); lpp_presolve(lpp); LPX * pre = lpp_build_prob(lpp); lpx_set_int_parm(pre, LPX_K_PRESOL, 0); lpx_set_class(pre, LPX_MIP); lpx_simplex(pre); lpx_integer(pre); mip_to_soln(pre); lpp_alloc_sol(lpp); lpp_load_sol(lpp, pre); lpx_delete_prob(pre); lpp_postsolve(lpp); lpp_unload_sol(lpp, orig); soln_to_mip(orig); lpp_delete_wksp(lpp); lpx_print_sol(orig, "/dev/stdout"); lpx_delete_prob(orig); return 0; }