glpmps01.c
来自「著名的大规模线性规划求解器源码GLPK.C语言版本,可以修剪.内有详细帮助文档.」· C语言 代码 · 共 1,469 行 · 第 1/4 页
C
1,469 行
} if (dsa->f4[0] == '\0') { xprintf("%s:%d: missing coefficient value in field 4\n", dsa->fname, dsa->count); goto fail; } if (str2num(dsa->f4, &temp)) { xprintf("%s:%d: invalid coefficient value in field 4\n", dsa->fname, dsa->count); goto fail; } if (map[i]) { xprintf("%s:%d: coefficient in row %s multiply specified\n", dsa->fname, dsa->count, dsa->f3); goto fail; } map[i] = 1, len++, ind[len] = i, aij[len] = temp; /* scan optional row name and coefficient in fields 5 and 6 */ if (dsa->f5[0] == '\0' && dsa->f6[0] == '\0') goto loop; if (dsa->f5[0] == '\0') { xprintf("%s:%d: missing row name in field 5\n", dsa->fname, dsa->count); goto fail; } i = lpx_find_row(dsa->lp, dsa->f5); if (i == 0) { xprintf("%s:%d: row %s not found\n", dsa->fname, dsa->count, dsa->f5); goto fail; } if (dsa->f6[0] == '\0') { xprintf("%s:%d: missing coefficient value in field 6\n", dsa->fname, dsa->count); goto fail; } if (str2num(dsa->f6, &temp)) { xprintf("%s:%d: invalid coefficient value in field 6\n", dsa->fname, dsa->count); goto fail; } if (map[i]) { xprintf("%s:%d: coefficient in row %s multiply specified\n", dsa->fname, dsa->count, dsa->f5); goto fail; } map[i] = 1, len++, ind[len] = i, aij[len] = temp; goto loop;done: /* finish the last column */ if (j != 0) put_column(dsa, j, len, ind, aij); xfree(map), xfree(ind), xfree(aij); return 0;fail: xfree(map), xfree(ind), xfree(aij); return 1;}static void set_rhs(struct dsa *dsa, int i, double b){ /* set right-hand side for i-th row */ switch (lpx_get_row_type(dsa->lp, i)) { case LPX_FR: if (dsa->obj == i) lpx_set_obj_coef(dsa->lp, 0, b); else if (b != 0.0) xprintf("%s:%d: warning: non-zero rhs for free row %s ig" "nored\n", dsa->fname, dsa->count, lpx_get_row_name(dsa->lp, i)); break; case LPX_LO: lpx_set_row_bnds(dsa->lp, i, LPX_LO, b, 0.0); break; case LPX_UP: lpx_set_row_bnds(dsa->lp, i, LPX_UP, 0.0, b); break; case LPX_FX: lpx_set_row_bnds(dsa->lp, i, LPX_FX, b, b); break; default: xassert(dsa != dsa); } return;}static int read_rhs(struct dsa *dsa){ /* process data cards in RHS section */ int i, m, *map; double temp; char name[8+1] = "\n"; /* allocate working array */ m = lpx_get_num_rows(dsa->lp); map = xcalloc(1+m, sizeof(int)); for (i = 1; i <= m; i++) map[i] = 0;loop: /* read and split next data card */ if (read_card(dsa)) goto fail; if (dsa->card[0] != ' ') goto done; if (split_card(dsa)) goto fail; /* field 1 must be blank */ if (dsa->f1[0] != '\0') { xprintf("%s:%d: invalid data card; field 1 must be blank\n", dsa->fname, dsa->count); goto fail; } /* scan optional rhs vector name in field 2 */ if (name[0] == '\n') strcpy(name, dsa->f2); if (!(dsa->f2[0] == '\0' || strcmp(dsa->f2, name) == 0)) { xprintf("%s:%d: at most one rhs vector allowed\n", dsa->fname, dsa->count); goto fail; } /* scan row name and rhs value in fields 3 and 4 */ if (dsa->f3[0] == '\0') { xprintf("%s:%d: missing row name in field 3\n", dsa->fname, dsa->count); goto fail; } i = lpx_find_row(dsa->lp, dsa->f3); if (i == 0) { xprintf("%s:%d: row %s not found\n", dsa->fname, dsa->count, dsa->f3); goto fail; } if (dsa->f4[0] == '\0') { xprintf("%s:%d: missing rhs value in field 4\n", dsa->fname, dsa->count); goto fail; } if (str2num(dsa->f4, &temp)) { xprintf("%s:%d: invalid rhs value in field 4\n", dsa->fname, dsa->count); goto fail; } if (map[i]) { xprintf("%s:%d: rhs for row %s multiply specified\n", dsa->fname, dsa->count, dsa->f3); goto fail; } set_rhs(dsa, i, temp), map[i] = 1; /* scan optional row name and rhs value in fields 5 and 6 */ if (dsa->f5[0] == '\0' && dsa->f6[0] == '\0') goto loop; if (dsa->f5[0] == '\0') { xprintf("%s:%d: missing row name in field 5\n", dsa->fname, dsa->count); goto fail; } i = lpx_find_row(dsa->lp, dsa->f5); if (i == 0) { xprintf("%s:%d: row %s not found\n", dsa->fname, dsa->count, dsa->f5); goto fail; } if (dsa->f6[0] == '\0') { xprintf("%s:%d: missing rhs value in field 6\n", dsa->fname, dsa->count); goto fail; } if (str2num(dsa->f6, &temp)) { xprintf("%s:%d: invalid rhs value in field 6\n", dsa->fname, dsa->count); goto fail; } if (map[i]) { xprintf("%s:%d: rhs for row %s multiply specified\n", dsa->fname, dsa->count, dsa->f5); goto fail; } set_rhs(dsa, i, temp), map[i] = 1; goto loop;done: xfree(map); return 0;fail: xfree(map); return 1;}static void set_range(struct dsa *dsa, int i, double r){ /* set range value for i-th row */ double b; switch (lpx_get_row_type(dsa->lp, i)) { case LPX_FR: xprintf("%s:%d: warning: range value for free row %s ignore" "d\n", dsa->fname, dsa->count, lpx_get_row_name(dsa->lp, i)); break; case LPX_LO: b = lpx_get_row_lb(dsa->lp, i); if (r == 0.0) lpx_set_row_bnds(dsa->lp, i, LPX_FX, b, b); else lpx_set_row_bnds(dsa->lp, i, LPX_DB, b, b + fabs(r)); break; case LPX_UP: b = lpx_get_row_ub(dsa->lp, i); if (r == 0.0) lpx_set_row_bnds(dsa->lp, i, LPX_FX, b, b); else lpx_set_row_bnds(dsa->lp, i, LPX_DB, b - fabs(r), b); break; case LPX_FX: b = lpx_get_row_lb(dsa->lp, i); if (r > 0.0) lpx_set_row_bnds(dsa->lp, i, LPX_DB, b, b + fabs(r)); else if (r < 0.0) lpx_set_row_bnds(dsa->lp, i, LPX_DB, b - fabs(r), b); break; default: xassert(dsa != dsa); } return;}static int read_ranges(struct dsa *dsa){ /* process data cards in RANGES section */ int i, m, *map; double temp; char name[8+1] = "\n"; /* allocate working array */ m = lpx_get_num_rows(dsa->lp); map = xcalloc(1+m, sizeof(int)); for (i = 1; i <= m; i++) map[i] = 0;loop: /* read and split next data card */ if (read_card(dsa)) goto fail; if (dsa->card[0] != ' ') goto done; if (split_card(dsa)) goto fail; /* field 1 must be blank */ if (dsa->f1[0] != '\0') { xprintf("%s:%d: invalid data card; field 1 must be blank\n", dsa->fname, dsa->count); goto fail; } /* scan optional ranges vector name in field 2 */ if (name[0] == '\n') strcpy(name, dsa->f2); if (!(dsa->f2[0] == '\0' || strcmp(dsa->f2, name) == 0)) { xprintf("%s:%d: at most one ranges vector allowed\n", dsa->fname, dsa->count); goto fail; } /* scan row name and range value in fields 3 and 4 */ if (dsa->f3[0] == '\0') { xprintf("%s:%d: missing row name in field 3\n", dsa->fname, dsa->count); goto fail; } i = lpx_find_row(dsa->lp, dsa->f3); if (i == 0) { xprintf("%s:%d: row %s not found\n", dsa->fname, dsa->count, dsa->f3); goto fail; } if (dsa->f4[0] == '\0') { xprintf("%s:%d: missing range value in field 4\n", dsa->fname, dsa->count); goto fail; } if (str2num(dsa->f4, &temp)) { xprintf("%s:%d: invalid range value in field 4\n", dsa->fname, dsa->count); goto fail; } if (map[i]) { xprintf("%s:%d: range for row %s multiply specified\n", dsa->fname, dsa->count, dsa->f3); goto fail; } set_range(dsa, i, temp), map[i] = 1; /* scan optional row name and range value in fields 5 and 6 */ if (dsa->f5[0] == '\0' && dsa->f6[0] == '\0') goto loop; if (dsa->f5[0] == '\0') { xprintf("%s:%d: missing row name in field 5\n", dsa->fname, dsa->count); goto fail; } i = lpx_find_row(dsa->lp, dsa->f5); if (i == 0) { xprintf("%s:%d: row %s not found\n", dsa->fname, dsa->count, dsa->f5); goto fail; } if (dsa->f6[0] == '\0') { xprintf("%s:%d: missing range value in field 6\n", dsa->fname, dsa->count); goto fail; } if (str2num(dsa->f6, &temp)) { xprintf("%s:%d: invalid range value in field 6\n", dsa->fname, dsa->count); goto fail; } if (map[i]) { xprintf("%s:%d: range for row %s multiply specified\n", dsa->fname, dsa->count, dsa->f5); goto fail; } set_range(dsa, i, temp), map[i] = 1; goto loop;done: xfree(map); return 0;fail: xfree(map); return 1;}static int read_bounds(struct dsa *dsa){ /* process data cards in BOUNDS section */ int j, type; double lb, ub, temp; char name[8+1] = "\n";loop: /* read and split next data card */ if (read_card(dsa)) goto fail; if (dsa->card[0] != ' ') goto done; if (split_card(dsa)) goto fail; /* scan bound type in field 1 */ if (dsa->f1[0] == '\0') { xprintf("%s:%d: missing bound type in field 1\n", dsa->fname, dsa->count); goto fail; } /* scan optional bounds vector name in field 2 */ if (name[0] == '\n') strcpy(name, dsa->f2); if (!(dsa->f2[0] == '\0' || strcmp(dsa->f2, name) == 0)) { xprintf("%s:%d: at most one bounds vector allowed\n", dsa->fname, dsa->count); goto fail; } /* scan column name in field 3 */ if (dsa->f3[0] == '\0') { xprintf("%s:%d: missing column name in field 3\n", dsa->fname, dsa->count); goto fail; } j = lpx_find_col(dsa->lp, dsa->f3); if (j == 0) { xprintf("%s:%d: column %s not found\n", dsa->fname, dsa->count, dsa->f3); goto fail; } /* scan optional bound value in field 4 */ if (!(strcmp(dsa->f1, "LO") == 0 || strcmp(dsa->f1, "UP") == 0 || strcmp(dsa->f1, "FX") == 0 || strcmp(dsa->f1, "LI") == 0 || strcmp(dsa->f1, "UI") == 0)) goto skip; if (dsa->f4[0] == '\0') { xprintf("%s:%d: missing bound value in field 4\n", dsa->fname, dsa->count); goto fail; } if (str2num(dsa->f4, &temp)) { xprintf("%s:%d: invalid bound value in field 4\n", dsa->fname, dsa->count); goto fail; }skip: /* change column bounds */ type = lpx_get_col_type(dsa->lp, j); if (type == LPX_FR || type == LPX_UP) lb = -DBL_MAX; else lb = lpx_get_col_lb(dsa->lp, j); if (type == LPX_FR || type == LPX_LO) ub = +DBL_MAX; else ub = lpx_get_col_ub(dsa->lp, j); if (strcmp(dsa->f1, "LO") == 0) lb = temp; else if (strcmp(dsa->f1, "UP") == 0) ub = temp; else if (strcmp(dsa->f1, "FX") == 0) lb = ub = temp; else if (strcmp(dsa->f1, "FR") == 0) lb = -DBL_MAX, ub = +DBL_MAX; else if (strcmp(dsa->f1, "MI") == 0) lb = -DBL_MAX; else if (strcmp(dsa->f1, "PL") == 0) ub = +DBL_MAX;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?