📄 glpmps02.c
字号:
if (read_item(dsa)) goto fail; if (dsa->item[0] == '\0') { xprintf("%s:%d: missing row name\n", dsa->fname, dsa->count); goto fail; } /* find row */ i = lpx_find_row(dsa->lp, dsa->item); if (i == 0) { xprintf("%s:%d: row %s not found\n", dsa->fname, dsa->count, dsa->item); goto fail; } /* scan rhs value */ if (read_item(dsa)) goto fail; if (dsa->item[0] == '\0') { xprintf("%s:%d: missing rhs value\n", dsa->fname, dsa->count); goto fail; } if (str2num(dsa->item, &temp)) { xprintf("%s:%d: invalid rhs value\n", dsa->fname, dsa->count); goto fail; } if (map[i]) { xprintf("%s:%d: rhs for row %s multiply specified\n", dsa->fname, dsa->count, lpx_get_row_name(dsa->lp, i)); goto fail; } set_rhs(dsa, i, temp), map[i] = 1; /* there may be another row name and rhs value */ if (read_item(dsa)) goto fail; if (dsa->item[0] == '\0') goto loop; /* find row */ i = lpx_find_row(dsa->lp, dsa->item); if (i == 0) { xprintf("%s:%d: row %s not found\n", dsa->fname, dsa->count, dsa->item); goto fail; } /* scan rhs value */ if (read_item(dsa)) goto fail; if (dsa->item[0] == '\0') { xprintf("%s:%d: missing rhs value\n", dsa->fname, dsa->count); goto fail; } if (str2num(dsa->item, &temp)) { xprintf("%s:%d: invalid rhs value\n", dsa->fname, dsa->count); goto fail; } if (map[i]) { xprintf("%s:%d: rhs for row %s multiply specified\n", dsa->fname, dsa->count, lpx_get_row_name(dsa->lp, i)); goto fail; } set_rhs(dsa, i, temp), map[i] = 1; /* skip remaining characters */ while (dsa->c != '\n') if (read_char(dsa)) goto fail; if (read_item(dsa)) goto fail; xassert(dsa->item[0] == '\0'); 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 lines in RANGES section */ int i, m, *map; double temp; char name[sizeof(dsa->item)] = ""; /* 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: /* check if there is more data lines */ if (dsa->c != ' ') goto done; /* scan range vector name */ if (read_item(dsa)) goto fail; if (dsa->item[0] == '\0') { xprintf("%s:%d: missing range vector name\n", dsa->fname, dsa->count); goto fail; } if (name[0] == '\0') strcpy(name, dsa->item); if (strcmp(dsa->item, name) != 0) { xprintf("%s:%d: at most one range vector allowed\n", dsa->fname, dsa->count); goto fail; } /* scan row name */ if (read_item(dsa)) goto fail; if (dsa->item[0] == '\0') { xprintf("%s:%d: missing row name\n", dsa->fname, dsa->count); goto fail; } /* find row */ i = lpx_find_row(dsa->lp, dsa->item); if (i == 0) { xprintf("%s:%d: row %s not found\n", dsa->fname, dsa->count, dsa->item); goto fail; } /* scan range value */ if (read_item(dsa)) goto fail; if (dsa->item[0] == '\0') { xprintf( "%s:%d: missing range value\n", dsa->fname, dsa->count); goto fail; } if (str2num(dsa->item, &temp)) { xprintf( "%s:%d: invalid range value\n", dsa->fname, dsa->count); goto fail; } if (map[i]) { xprintf("%s:%d: range for row %s multiply specified\n", dsa->fname, dsa->count, lpx_get_row_name(dsa->lp, i)); goto fail; } set_range(dsa, i, temp), map[i] = 1; /* there may be another row name and range value */ if (read_item(dsa)) goto fail; if (dsa->item[0] == '\0') goto loop; /* find row */ i = lpx_find_row(dsa->lp, dsa->item); if (i == 0) { xprintf("%s:%d: row %s not found\n", dsa->fname, dsa->count, dsa->item); goto fail; } /* scan range value */ if (read_item(dsa)) goto fail; if (dsa->item[0] == '\0') { xprintf( "%s:%d: missing range value\n", dsa->fname, dsa->count); goto fail; } if (str2num(dsa->item, &temp)) { xprintf( "%s:%d: invalid range value\n", dsa->fname, dsa->count); goto fail; } if (map[i]) { xprintf("%s:%d: range for row %s multiply specified\n", dsa->fname, dsa->count, lpx_get_row_name(dsa->lp, i)); goto fail; } set_range(dsa, i, temp), map[i] = 1; /* skip remaining characters */ while (dsa->c != '\n') if (read_char(dsa)) goto fail; if (read_item(dsa)) goto fail; xassert(dsa->item[0] == '\0'); goto loop;done: xfree(map); return 0;fail: xfree(map); return 1;}static int read_bounds(struct dsa *dsa){ /* process data lines in BOUNDS section */ int j, type; double lb, ub, temp; char btyp[2+1]; char name[sizeof(dsa->item)] = "";loop: /* check if there is more data lines */ if (dsa->c != ' ') goto done; /* scan bound type */ if (read_item(dsa)) goto fail; if (dsa->item[0] == '\0') { xprintf( "%s:%d: missing bound type\n", dsa->fname, dsa->count); goto fail; } if (strlen(dsa->item) != 2) { xprintf( "%s:%d: invalid bound type\n", dsa->fname, dsa->count); goto fail; } strcpy(btyp, dsa->item); /* scan bound vector name */ if (read_item(dsa)) goto fail; if (dsa->item[0] == '\0') { xprintf("%s:%d: missing bound vector name\n", dsa->fname, dsa->count); goto fail; } if (name[0] == '\0') strcpy(name, dsa->item); if (strcmp(dsa->item, name) != 0) { xprintf("%s:%d: at most one bound vector allowed\n", dsa->fname, dsa->count); goto fail; } /* scan column name */ if (read_item(dsa)) goto fail; if (dsa->item[0] == '\0') { xprintf( "%s:%d: missing column name\n", dsa->fname, dsa->count); goto fail; } /* find column */ j = lpx_find_col(dsa->lp, dsa->item); if (j == 0) { xprintf("%s:%d: column %s not found\n", dsa->fname, dsa->count, dsa->item); goto fail; } /* scan optional bound value */ if (!(strcmp(btyp, "LO") == 0 || strcmp(btyp, "UP") == 0 || strcmp(btyp, "FX") == 0 || strcmp(btyp, "LI") == 0 || strcmp(btyp, "UI") == 0)) goto skip; if (read_item(dsa)) goto fail; if (dsa->item[0] == '\0') { xprintf( "%s:%d: missing bound value\n", dsa->fname, dsa->count); goto fail; } if (str2num(dsa->item, &temp)) { xprintf( "%s:%d: invalid bound value\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(btyp, "LO") == 0) lb = temp; else if (strcmp(btyp, "UP") == 0) ub = temp; else if (strcmp(btyp, "FX") == 0) lb = ub = temp; else if (strcmp(btyp, "FR") == 0) lb = -DBL_MAX, ub = +DBL_MAX; else if (strcmp(btyp, "MI") == 0) lb = -DBL_MAX; else if (strcmp(btyp, "PL") == 0) ub = +DBL_MAX;#if 1 /* 11/V-2006 */ else if (strcmp(btyp, "LI") == 0) { /* lpx_set_class(dsa->lp, LPX_MIP); */ lpx_set_col_kind(dsa->lp, j, LPX_IV); lb = temp; }#endif else if (strcmp(btyp, "UI") == 0) { /* lpx_set_class(dsa->lp, LPX_MIP); */ lpx_set_col_kind(dsa->lp, j, LPX_IV); ub = temp; } else if (strcmp(btyp, "BV") == 0) { /* lpx_set_class(dsa->lp, LPX_MIP); */ lpx_set_col_kind(dsa->lp, j, LPX_IV); lb = 0.0, ub = 1.0; } else { xprintf( "%s:%d: invalid bound type\n", dsa->fname, dsa->count); goto fail; } if (lb == -DBL_MAX && ub == +DBL_MAX) type = LPX_FR; else if (ub == +DBL_MAX) type = LPX_LO; else if (lb == -DBL_MAX) type = LPX_UP; else if (lb != ub) type = LPX_DB; else type = LPX_FX; lpx_set_col_bnds(dsa->lp, j, type, lb, ub); /* skip remaining characters */ while (dsa->c != '\n') if (read_char(dsa)) goto fail; if (read_item(dsa)) goto fail; xassert(dsa->item[0] == '\0'); goto loop;done: return 0;fail: return 1;}int read_freemps(LPX *lp, const char *fname){ /* read problem data in free MPS format */ struct dsa _dsa, *dsa = &_dsa; glp_erase_prob(lp); dsa->lp = lp; dsa->fname = fname; dsa->fp = NULL; dsa->count = 0; dsa->c = '\n'; dsa->obj = 0; xprintf("glp_read_mps: reading problem data from `%s'...\n", dsa->fname); dsa->fp = xfopen(dsa->fname, "r"); if (dsa->fp == NULL) { xprintf("glp_read_mps: unable to open `%s' - %s\n", dsa->fname, strerror(errno)); goto fail; } lpx_create_index(dsa->lp); /* read the very first character */ if (read_char(dsa)) goto fail; /* read NAME indicator record */ if (dsa->c == ' ')err1: { xprintf("%s:%d: NAME indicator record missing\n", dsa->fname, dsa->count); goto fail; } if (read_item(dsa)) goto fail; if (strcmp(dsa->item, "NAME") != 0) goto err1; if (read_item(dsa)) goto fail; if (dsa->item[0] == '\0') xprintf("glp_read_mps: problem name not specified\n"); else { xprintf("glp_read_mps: problem %s\n", dsa->item); lpx_set_prob_name(dsa->lp, dsa->item); while (dsa->c != '\n') if (read_char(dsa)) goto fail; if (read_item(dsa)) goto fail; } xassert(dsa->item[0] == '\0'); /* read ROWS section */ if (dsa->c == ' ')err2: { xprintf("%s:%d: ROWS indicator record missing\n", dsa->fname, dsa->count); goto fail; } if (read_item(dsa)) goto fail; if (strcmp(dsa->item, "ROWS") != 0) goto err2; while (dsa->c != '\n') if (read_char(dsa)) goto fail; if (read_item(dsa)) goto fail; xassert(dsa->item[0] == '\0'); if (read_rows(dsa)) goto fail; /* read COLUMNS section */ xassert(dsa->c != ' '); if (read_item(dsa)) goto fail; if (strcmp(dsa->item, "COLUMNS") != 0) { xprintf("%s:%d: COLUMNS indicator record missing\n", dsa->fname, dsa->count); goto fail; } while (dsa->c != '\n') if (read_char(dsa)) goto fail; if (read_item(dsa)) goto fail; xassert(dsa->item[0] == '\0'); if (read_columns(dsa)) goto fail; { int m = lpx_get_num_rows(dsa->lp);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -