📄 glplpx01.c
字号:
default: xassert(ret != ret); } return ret;}int lpx_exact(LPX *lp){ /* easy-to-use driver to the exact simplex method */ glp_smcp parm; int ret; fill_smcp(lp, &parm); ret = glp_exact(lp, &parm); switch (ret) { case 0: ret = LPX_E_OK; break; case GLP_EBADB: case GLP_ESING: case GLP_EBOUND: case GLP_EFAIL: ret = LPX_E_FAULT; break; case GLP_EITLIM: ret = LPX_E_ITLIM; break; case GLP_ETMLIM: ret = LPX_E_TMLIM; break; default: xassert(ret != ret); } return ret;}int lpx_get_status(glp_prob *lp){ /* retrieve generic status of basic solution */ int status; switch (glp_get_status(lp)) { case GLP_OPT: status = LPX_OPT; break; case GLP_FEAS: status = LPX_FEAS; break; case GLP_INFEAS: status = LPX_INFEAS; break; case GLP_NOFEAS: status = LPX_NOFEAS; break; case GLP_UNBND: status = LPX_UNBND; break; case GLP_UNDEF: status = LPX_UNDEF; break; default: xassert(lp != lp); } return status;}int lpx_get_prim_stat(glp_prob *lp){ /* retrieve status of primal basic solution */ return glp_get_prim_stat(lp) - GLP_UNDEF + LPX_P_UNDEF;}int lpx_get_dual_stat(glp_prob *lp){ /* retrieve status of dual basic solution */ return glp_get_dual_stat(lp) - GLP_UNDEF + LPX_D_UNDEF;}double lpx_get_obj_val(LPX *lp){ /* retrieve objective value (basic solution) */ return glp_get_obj_val(lp);}int lpx_get_row_stat(LPX *lp, int i){ /* retrieve row status (basic solution) */ return glp_get_row_stat(lp, i) - GLP_BS + LPX_BS;}double lpx_get_row_prim(LPX *lp, int i){ /* retrieve row primal value (basic solution) */ return glp_get_row_prim(lp, i);}double lpx_get_row_dual(LPX *lp, int i){ /* retrieve row dual value (basic solution) */ return glp_get_row_dual(lp, i);}void lpx_get_row_info(glp_prob *lp, int i, int *tagx, double *vx, double *dx){ /* obtain row solution information */ if (tagx != NULL) *tagx = lpx_get_row_stat(lp, i); if (vx != NULL) *vx = lpx_get_row_prim(lp, i); if (dx != NULL) *dx = lpx_get_row_dual(lp, i); return;}int lpx_get_col_stat(LPX *lp, int j){ /* retrieve column status (basic solution) */ return glp_get_col_stat(lp, j) - GLP_BS + LPX_BS;}double lpx_get_col_prim(LPX *lp, int j){ /* retrieve column primal value (basic solution) */ return glp_get_col_prim(lp, j);}double lpx_get_col_dual(glp_prob *lp, int j){ /* retrieve column dual value (basic solution) */ return glp_get_col_dual(lp, j);}void lpx_get_col_info(glp_prob *lp, int j, int *tagx, double *vx, double *dx){ /* obtain column solution information */ if (tagx != NULL) *tagx = lpx_get_col_stat(lp, j); if (vx != NULL) *vx = lpx_get_col_prim(lp, j); if (dx != NULL) *dx = lpx_get_col_dual(lp, j); return;}int lpx_get_ray_info(LPX *lp){ /* determine what causes primal unboundness */ return glp_get_unbnd_ray(lp);}int lpx_eval_tab_row(LPX *lp, int k, int ind[], double val[]){ /* compute row of the simplex tableau */ return glp_eval_tab_row(lp, k, ind, val);}int lpx_eval_tab_col(LPX *lp, int k, int ind[], double val[]){ /* compute column of the simplex tableau */ return glp_eval_tab_col(lp, k, ind, val);}int lpx_interior(LPX *lp){ /* easy-to-use driver to the interior-point method */ int ret; ret = glp_interior(lp, NULL); switch (ret) { case 0: ret = LPX_E_OK; break; case GLP_EFAIL: ret = LPX_E_FAULT; break; case GLP_ENOFEAS: ret = LPX_E_NOFEAS; break; case GLP_ENOCVG: ret = LPX_E_NOCONV; break; case GLP_EITLIM: ret = LPX_E_ITLIM; break; case GLP_EINSTAB: ret = LPX_E_INSTAB; break; default: xassert(ret != ret); } return ret;}int lpx_ipt_status(glp_prob *lp){ /* retrieve status of interior-point solution */ int status; switch (glp_ipt_status(lp)) { case GLP_UNDEF: status = LPX_T_UNDEF; break; case GLP_OPT: status = LPX_T_OPT; break; default: xassert(lp != lp); } return status;}double lpx_ipt_obj_val(LPX *lp){ /* retrieve objective value (interior point) */ return glp_ipt_obj_val(lp);}double lpx_ipt_row_prim(LPX *lp, int i){ /* retrieve row primal value (interior point) */ return glp_ipt_row_prim(lp, i);}double lpx_ipt_row_dual(LPX *lp, int i){ /* retrieve row dual value (interior point) */ return glp_ipt_row_dual(lp, i);}double lpx_ipt_col_prim(LPX *lp, int j){ /* retrieve column primal value (interior point) */ return glp_ipt_col_prim(lp, j);}double lpx_ipt_col_dual(LPX *lp, int j){ /* retrieve column dual value (interior point) */ return glp_ipt_col_dual(lp, j);}void lpx_set_class(LPX *lp, int klass){ /* set problem class */ xassert(lp == lp); if (!(klass == LPX_LP || klass == LPX_MIP)) xfault("lpx_set_class: invalid problem class\n"); return;}int lpx_get_class(LPX *lp){ /* determine problem klass */ return glp_get_num_int(lp) == 0 ? LPX_LP : LPX_MIP;}void lpx_set_col_kind(LPX *lp, int j, int kind){ /* set (change) column kind */ glp_set_col_kind(lp, j, kind - LPX_CV + GLP_CV); return;}int lpx_get_col_kind(LPX *lp, int j){ /* retrieve column kind */ return glp_get_col_kind(lp, j) == GLP_CV ? LPX_CV : LPX_IV;}int lpx_get_num_int(LPX *lp){ /* retrieve number of integer columns */ return glp_get_num_int(lp);}int lpx_get_num_bin(LPX *lp){ /* retrieve number of binary columns */ return glp_get_num_bin(lp);}static int solve_mip(LPX *lp, int presolve){ glp_iocp parm; int ret; glp_init_iocp(&parm); switch (lpx_get_int_parm(lp, LPX_K_MSGLEV)) { case 0: parm.msg_lev = GLP_MSG_OFF; break; case 1: parm.msg_lev = GLP_MSG_ERR; break; case 2: parm.msg_lev = GLP_MSG_ON; break; case 3: parm.msg_lev = GLP_MSG_ALL; break; default: xassert(lp != lp); } switch (lpx_get_int_parm(lp, LPX_K_BRANCH)) { case 0: parm.br_tech = GLP_BR_FFV; break; case 1: parm.br_tech = GLP_BR_LFV; break; case 2: parm.br_tech = GLP_BR_DTH; break; case 3: parm.br_tech = GLP_BR_MFV; break; default: xassert(lp != lp); } switch (lpx_get_int_parm(lp, LPX_K_BTRACK)) { case 0: parm.bt_tech = GLP_BT_DFS; break; case 1: parm.bt_tech = GLP_BT_BFS; break; case 2: parm.bt_tech = GLP_BT_BPH; break; case 3: parm.bt_tech = GLP_BT_BLB; break; default: xassert(lp != lp); } parm.tol_int = lpx_get_real_parm(lp, LPX_K_TOLINT); parm.tol_obj = lpx_get_real_parm(lp, LPX_K_TOLOBJ); if (lpx_get_real_parm(lp, LPX_K_TMLIM) < 0.0 || lpx_get_real_parm(lp, LPX_K_TMLIM) > 1e6) parm.tm_lim = INT_MAX; else parm.tm_lim = (int)(1000.0 * lpx_get_real_parm(lp, LPX_K_TMLIM)); parm.mip_gap = lpx_get_real_parm(lp, LPX_K_MIPGAP); if (lpx_get_int_parm(lp, LPX_K_USECUTS) & LPX_C_GOMORY) parm.gmi_cuts = GLP_ON; else parm.gmi_cuts = GLP_OFF; if (lpx_get_int_parm(lp, LPX_K_USECUTS) & LPX_C_MIR) parm.mir_cuts = GLP_ON; else parm.mir_cuts = GLP_OFF; if (lpx_get_int_parm(lp, LPX_K_USECUTS) & LPX_C_COVER) parm.cov_cuts = GLP_ON; else parm.cov_cuts = GLP_OFF; if (lpx_get_int_parm(lp, LPX_K_USECUTS) & LPX_C_CLIQUE) parm.clq_cuts = GLP_ON; else parm.clq_cuts = GLP_OFF; parm.presolve = presolve; if (lpx_get_int_parm(lp, LPX_K_BINARIZE)) parm.binarize = GLP_ON; ret = glp_intopt(lp, &parm); switch (ret) { case 0: ret = LPX_E_OK; break; case GLP_ENOPFS: ret = LPX_E_NOPFS; break; case GLP_ENODFS: ret = LPX_E_NODFS; break; case GLP_EBOUND: case GLP_EROOT: ret = LPX_E_FAULT; break; case GLP_EFAIL: ret = LPX_E_SING; break; case GLP_EMIPGAP: ret = LPX_E_MIPGAP; break; case GLP_ETMLIM: ret = LPX_E_TMLIM; break; default: xassert(ret != ret); } return ret;}int lpx_integer(LPX *lp){ /* easy-to-use driver to the branch-and-bound method */ return solve_mip(lp, GLP_OFF);}int lpx_intopt(LPX *lp){ /* easy-to-use driver to the branch-and-bound method */ return solve_mip(lp, GLP_ON);}int lpx_mip_status(glp_prob *lp){ /* retrieve status of MIP solution */ int status; switch (glp_mip_status(lp)) { case GLP_UNDEF: status = LPX_I_UNDEF; break; case GLP_OPT: status = LPX_I_OPT; break; case GLP_FEAS: status = LPX_I_FEAS; break; case GLP_NOFEAS: status = LPX_I_NOFEAS; break; default: xassert(lp != lp); } return status;}double lpx_mip_obj_val(LPX *lp){ /* retrieve objective value (MIP solution) */ return glp_mip_obj_val(lp);}double lpx_mip_row_val(LPX *lp, int i){ /* retrieve row value (MIP solution) */ return glp_mip_row_val(lp, i);}double lpx_mip_col_val(LPX *lp, int j){ /* retrieve column value (MIP solution) */ return glp_mip_col_val(lp, j);}LPX *lpx_read_mps(const char *fname){ /* read problem data in fixed MPS format */ LPX *lp = lpx_create_prob(); if (glp_read_mps(lp, GLP_MPS_DECK, NULL, fname)) lpx_delete_prob(lp), lp = NULL; return lp;}int lpx_write_mps(LPX *lp, const char *fname){ /* write problem data in fixed MPS format */ return glp_write_mps(lp, GLP_MPS_DECK, NULL, fname);}int lpx_read_bas(LPX *lp, const char *fname){ /* read LP basis in fixed MPS format */ return read_bas(lp, fname);}int lpx_write_bas(LPX *lp, const char *fname){ /* write LP basis in fixed MPS format */ return write_bas(lp, fname);}LPX *lpx_read_freemps(const char *fname){ /* read problem data in free MPS format */ LPX *lp = lpx_create_prob(); if (glp_read_mps(lp, GLP_MPS_FILE, NULL, fname)) lpx_delete_prob(lp), lp = NULL; return lp;}int lpx_write_freemps(LPX *lp, const char *fname){ /* write problem data in free MPS format */ return glp_write_mps(lp, GLP_MPS_FILE, NULL, fname);}LPX *lpx_read_cpxlp(const char *fname){ /* read problem data in CPLEX LP format */ LPX *lp; lp = lpx_create_prob(); if (glp_read_lp(lp, NULL, fname)) lpx_delete_prob(lp), lp = NULL; return lp;}int lpx_write_cpxlp(LPX *lp, const char *fname){ /* write problem data in CPLEX LP format */ return glp_write_lp(lp, NULL, fname);}LPX *lpx_read_model(const char *model, const char *data, const char *output){ /* read LP/MIP model written in GNU MathProg language */ LPX *lp = NULL; glp_tran *tran; /* allocate the translator workspace */ tran = glp_mpl_alloc_wksp(); /* read model section and optional data section */ if (glp_mpl_read_model(tran, model, data != NULL)) goto done; /* read separate data section, if required */ if (data != NULL) if (glp_mpl_read_data(tran, data)) goto done; /* generate the model */ if (glp_mpl_generate(tran, output)) goto done; /* build the problem instance from the model */ lp = glp_create_prob(); glp_mpl_build_prob(tran, lp);done: /* free the translator workspace */ glp_mpl_free_wksp(tran); /* bring the problem object to the calling program */ return lp;}int lpx_is_b_avail(glp_prob *lp){ /* check if LP basis is available */ return glp_bf_exists(lp);}int lpx_main(int argc, const char *argv[]){ /* stand-alone LP/MIP solver */ return glp_main(argc, argv);}/* eof */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -