📄 cplex.c
字号:
CPXLP *CPXcreateprob(CPXENV *env, int *status, const char *probname){ CPXLP *lp = NULL; int errcode; errcode = checkenv(env); if (errcode) goto done; lp = glp_malloc(sizeof(struct CPXLP)); lp->env = env; lp->prob = glp_create_prob(); glp_set_prob_name(lp->prob, probname); lp->rflen = 100; lp->rflag = glp_calloc(lp->rflen, sizeof(char)); lp->iwlen = 100; lp->iwork = glp_calloc(lp->iwlen, sizeof(int)); memset(lp->iwork, 0, lp->iwlen * sizeof(int)); lp->link = env->list; env->list = lp; invalidate(lp);done: if (status != NULL) *status = errcode; return lp;}int CPXdelcols(CPXENV *env, CPXLP *lp, int begin, int end){ int j, n, errcode; errcode = checklp(env, lp); if (errcode) goto done; n = glp_get_num_cols(lp->prob); if (!(0 <= begin && begin <= end && end < n)) { errcode = error(env, CPXERR_INDEX_RANGE); goto done; } errcode = 0; invalidate(lp); enlargeiwork(lp, end-begin+1); for (j = begin; j <= end; j++) lp->iwork[j-begin] = j+1; glp_del_cols(lp->prob, end-begin+1, lp->iwork-1); for (j = begin; j <= end; j++) lp->iwork[j-begin] = 0;done: return errcode;}int CPXdelrows(CPXENV *env, CPXLP *lp, int begin, int end){ int i, m, errcode; errcode = checklp(env, lp); if (errcode) goto done; m = glp_get_num_rows(lp->prob); if (!(0 <= begin && begin <= end && end < m)) { errcode = error(env, CPXERR_INDEX_RANGE); goto done; } errcode = 0; invalidate(lp); enlargeiwork(lp, end-begin+1); for (i = begin; i <= end; i++) lp->iwork[i-begin] = i+1; glp_del_rows(lp->prob, end-begin+1, lp->iwork-1); for (i = begin; i <= end; i++) lp->iwork[i-begin] = 0; for (i = end+1; i < m; i++) lp->rflag[i-(end-begin+1)] = lp->rflag[i];done: return errcode;}int CPXdelsetcols(CPXENV *env, CPXLP *lp, int delstat[]){ xassert(env == env); xassert(lp == lp); xassert(delstat == delstat); printf("CPXdelsetcols: not implemented yet\n"); exit(EXIT_FAILURE); return -1;}int CPXdelsetrows(CPXENV *env, CPXLP *lp, int delstat[]){ int i, m, cnt, ind, errcode; errcode = checklp(env, lp); if (errcode) goto done; m = glp_get_num_rows(lp->prob); if (m > 0 && delstat == NULL) { errcode = error(env, CPXERR_NULL_POINTER); goto done; } errcode = 0; invalidate(lp); enlargeiwork(lp, m); cnt = ind = 0; for (i = 0; i < m; i++) { if (delstat[i] == 1) { delstat[i] = -1; lp->iwork[cnt++] = i+1; } else { delstat[i] = ind; lp->rflag[ind++] = lp->rflag[i]; } } if (cnt > 0) glp_del_rows(lp->prob, cnt, lp->iwork-1); for (i = 0; i < cnt; i++) lp->iwork[i] = 0;done: return errcode;}int CPXdualopt(CPXENV *env, CPXLP *lp);int CPXfreeprob(CPXENV *env, CPXLP **_lp){ CPXLP *lp; int errcode; errcode = checkenv(env); if (errcode) goto done; if (_lp == NULL) { errcode = error(env, CPXERR_NULL_POINTER); goto done; } lp = *_lp; errcode = checklp(env, lp); if (errcode) goto done; errcode = 0; env = lp->env; if (env->list == lp) env->list = lp->link; else { CPXLP *pp; for (pp = env->list; pp != NULL; pp = pp->link) if (pp->link == lp) break; xassert(pp != NULL); pp->link = lp->link; } glp_delete_prob(lp->prob); glp_free(lp->rflag); glp_free(lp->iwork); glp_free(lp); *_lp = NULL;done: return errcode;}int CPXgetbase(CPXENV *env, CPXLP *lp, int cstat[], int rstat[]){ int i, j, m, n, stat, errcode; errcode = checklp(env, lp); if (errcode) goto done; if (!lp->stat) { errcode = error(env, CPXERR_NO_SOLN); goto done; } if (lp->meth == CPX_ALG_PRIMAL || lp->meth == CPX_ALG_DUAL) ; else { errcode = error(env, CPXERR_NO_BASIC_SOLN); goto done; } errcode = 0; if (rstat != NULL) { m = glp_get_num_rows(lp->prob); for (i = 0; i < m; i++) { stat = glp_get_row_stat(lp->prob, i+1); if (stat == GLP_BS) rstat[i] = CPX_BASIC; else if (lp->rflag[i] == RF_NOT_RANGED || stat != GLP_NU) rstat[i] = CPX_AT_LOWER; else rstat[i] = CPX_AT_UPPER; } } if (cstat != NULL) { n = glp_get_num_cols(lp->prob); for (j = 0; j < n; j++) { stat = glp_get_col_stat(lp->prob, j+1); if (stat == GLP_BS) cstat[j] = CPX_BASIC; else if (stat == GLP_NU) cstat[j] = CPX_AT_UPPER; else if (stat == GLP_NF) cstat[j] = CPX_FREE_SUPER; else cstat[j] = CPX_AT_LOWER; } }done: return errcode;}int CPXgetbasednorms(CPXENV *env, CPXLP *lp, int cstat[], int rstat[], double dnorm[]){ int i, m, errcode; errcode = CPXgetbase(env, lp, cstat, rstat); if (errcode) goto done; if (dnorm != NULL) { m = glp_get_num_rows(lp->prob); for (i = 0; i < m; i++) dnorm[i] = 1.0; }done: return errcode;}int CPXgetbhead(CPXENV *env, CPXLP *lp, int head[], double x[]){ xassert(env == env); xassert(lp == lp); xassert(head == head); xassert(x == x); printf("CPXgetbhead: not implemented yet\n"); exit(EXIT_FAILURE); return -1;}int CPXgetdblparam(CPXENV *env, int whichparam, double *value){ int k, errcode; errcode = checkenv(env); if (errcode) goto done; k = finddblparam(whichparam); if (k < 0) { errcode = error(env, CPXERR_BAD_PARAM_NUM); goto done; } errcode = 0; if (value != NULL) *value = env->dblparam[k];done: return errcode;}int CPXgetdj(CPXENV *env, CPXLP *lp, double dj[], int begin, int end){ int j, n, errcode; errcode = checklp(env, lp); if (errcode) goto done; n = glp_get_num_cols(lp->prob); if (!(0 <= begin && begin <= end && end < n)) { errcode = error(env, CPXERR_INDEX_RANGE); goto done; } if (!lp->stat) { errcode = error(env, CPXERR_NO_SOLN); goto done; } errcode = 0; if (lp->meth == CPX_ALG_PRIMAL || lp->meth == CPX_ALG_DUAL) { if (dj != NULL) { for (j = begin; j <= end; j++) dj[j-begin] = glp_get_col_dual(lp->prob, j+1); } } else xassert(lp != lp);done: return errcode;}char *CPXgeterrorstring(CPXENV *env, int errcode, char *buffer){ const char *string; xassert(env == env); string = finderrstring(errcode); if (string == NULL) buffer = NULL; else sprintf(buffer, "CPLEX Error %5d: %s.\n", errcode, string); return buffer;}int CPXgetijdiv(CPXENV *env, CPXLP *lp, int *idiv, int *jdiv){ xassert(env == env); xassert(lp == lp); xassert(idiv == idiv); xassert(jdiv == jdiv); printf("CPXgetijdiv: not implemented yet\n"); exit(EXIT_FAILURE); return -1;}int CPXgetintparam(CPXENV *env, int whichparam, int *value){ int k, errcode; errcode = checkenv(env); if (errcode) goto done; k = findintparam(whichparam); if (k < 0) { errcode = error(env, CPXERR_BAD_PARAM_NUM); goto done; } errcode = 0; if (value != NULL) *value = env->intparam[k];done: return errcode;}int CPXgetlb(CPXENV *env, CPXLP *lp, double lb[], int begin, int end){ xassert(env == env); xassert(lp == lp); xassert(lb == lb); xassert(begin == begin); xassert(end == end); printf("CPXgetlb: not implemented yet\n"); exit(EXIT_FAILURE); return -1;}int CPXgetmethod(CPXENV *env, CPXLP *lp){ int method; if (checklp(env, lp)) method = CPX_ALG_NONE; else method = lp->meth; return method;}int CPXgetnumcols(CPXENV *env, CPXLP *lp){ int numcols; if (checklp(env, lp)) numcols = 0; else numcols = glp_get_num_cols(lp->prob); return numcols;}int CPXgetnumnz(CPXENV *env, CPXLP *lp){ int numnz; if (checklp(env, lp)) numnz = 0; else numnz = glp_get_num_nz(lp->prob); return numnz;}int CPXgetnumrows(CPXENV *env, CPXLP *lp){ int numrows; if (checklp(env, lp)) numrows = 0; else numrows = glp_get_num_rows(lp->prob); return numrows;}int CPXgetobjval(CPXENV *env, CPXLP *lp, double *objval){ int errcode; errcode = checklp(env, lp); if (errcode) goto done; if (!lp->stat) { errcode = error(env, CPXERR_NO_SOLN); goto done; } errcode = 0; if (lp->meth == CPX_ALG_PRIMAL || lp->meth == CPX_ALG_DUAL) { if (objval != NULL) *objval = glp_get_obj_val(lp->prob); } else xassert(lp != lp);done: return errcode;}int CPXgetpi(CPXENV *env, CPXLP *lp, double pi[], int begin, int end){ int i, m, errcode; errcode = checklp(env, lp); if (errcode) goto done; m = glp_get_num_rows(lp->prob); if (!(0 <= begin && begin <= end && end < m)) { errcode = error(env, CPXERR_INDEX_RANGE); goto done; } if (!lp->stat) { errcode = error(env, CPXERR_NO_SOLN); goto done; } errcode = 0; if (lp->meth == CPX_ALG_PRIMAL || lp->meth == CPX_ALG_DUAL) { if (pi != NULL) { for (i = begin; i <= end; i++) pi[i-begin] = glp_get_row_dual(lp->prob, i+1); } } else xassert(lp != lp);done: return errcode;}int CPXgetsense(CPXENV *env, CPXLP *lp, char sense[], int begin, int end){ xassert(env == env); xassert(lp == lp); xassert(sense == sense); xassert(begin == begin); xassert(end == end); printf("CPXgetsense: not implemented yet\n"); exit(EXIT_FAILURE); return -1;}int CPXgetslack(CPXENV *env, CPXLP *lp, double slack[], int begin, int end){ int i, m, type, errcode; double temp; errcode = checklp(env, lp); if (errcode) goto done; m = glp_get_num_rows(lp->prob); if (!(0 <= begin && begin <= end && end < m)) { errcode = error(env, CPXERR_INDEX_RANGE); goto done; } if (!lp->stat) { errcode = error(env, CPXERR_NO_SOLN); goto done; } errcode = 0; if (lp->meth == CPX_ALG_PRIMAL || lp->meth == CPX_ALG_DUAL) { if (slack != NULL) { for (i = begin; i <= end; i++) { type = glp_get_row_type(lp->prob, i+1); temp = glp_get_row_prim(lp->prob, i+1); if (lp->rflag[i] == RF_NOT_RANGED) { if (type == GLP_LO || type == GLP_FX) slack[i-begin] = glp_get_row_lb(lp->prob, i+1) - temp; else if (type == GLP_UP) slack[i-begin] = glp_get_row_ub(lp->prob, i+1) - temp; else xassert(type != type); } else if (lp->rflag[i] == RF_RANGED_POS) { xassert(type == GLP_DB || type == GLP_FX); slack[i-begin] = temp - glp_get_row_lb(lp->prob, i+1); } else if (lp->rflag[i] == RF_RANGED_NEG) { xassert(type == GLP_DB); slack[i-begin] = temp - glp_get_row_ub(lp->prob, i+1); } else xassert(lp != lp); } } } else xassert(lp != lp);done: return errcode;}int CPXgetstat(CPXENV *env, CPXLP *lp){ int stat; if (checklp(env, lp)) stat = 0; else stat = lp->stat; return stat;}int CPXgetub(CPXENV *env, CPXLP *lp, double ub[], int begin, int end){ xassert(env == env); xassert(lp == lp);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -