📄 glpmps02.c
字号:
int n = lpx_get_num_cols(dsa->lp); int nnz = lpx_get_num_nz(dsa->lp); xprintf("glp_read_mps: %d row%s, %d column%s, %d non-zero%s\n", m, m == 1 ? "" : "s", n, n == 1 ? "" : "s", nnz, nnz == 1 ? "" : "s"); } /* read RHS section (optional) */ xassert(dsa->c != ' '); if (read_item(dsa)) goto fail; if (strcmp(dsa->item, "RHS") == 0) { while (dsa->c != '\n') if (read_char(dsa)) goto fail; if (read_item(dsa)) goto fail; xassert(dsa->item[0] == '\0'); if (read_rhs(dsa)) goto fail; xassert(dsa->c != ' '); if (read_item(dsa)) goto fail; } /* read RANGES section (optional) */ if (strcmp(dsa->item, "RANGES") == 0) { while (dsa->c != '\n') if (read_char(dsa)) goto fail; if (read_item(dsa)) goto fail; xassert(dsa->item[0] == '\0'); if (read_ranges(dsa)) goto fail; xassert(dsa->c != ' '); if (read_item(dsa)) goto fail; } /* read BOUNDS section (optional) */ if (strcmp(dsa->item, "BOUNDS") == 0) { while (dsa->c != '\n') if (read_char(dsa)) goto fail; if (read_item(dsa)) goto fail; xassert(dsa->item[0] == '\0'); if (read_bounds(dsa)) goto fail; xassert(dsa->c != ' '); if (read_item(dsa)) goto fail; } /* check ENDATA indicator line */ if (strcmp(dsa->item, "ENDATA") != 0) { xprintf("%s:%d: ENDATA indicator record missing\n", dsa->fname, dsa->count); goto fail; } if (lpx_get_class(dsa->lp) == LPX_MIP) { int ni = lpx_get_num_int(dsa->lp); int nb = lpx_get_num_bin(dsa->lp); char s[50]; if (nb == 0) strcpy(s, "none of"); else if (ni == 1 && nb == 1) strcpy(s, ""); else if (nb == 1) strcpy(s, "one of"); else if (nb == ni) strcpy(s, "all of"); else sprintf(s, "%d of", nb); xprintf("glp_read_mps: %d integer column%s, %s which %s binary" "\n", ni, ni == 1 ? "" : "s", s, nb == 1 ? "is" : "are"); } xprintf("glp_read_mps: %d records were read\n", dsa->count); xfclose(dsa->fp); lpx_delete_index(dsa->lp); lpx_order_matrix(dsa->lp); return 0;fail: if (dsa->lp != NULL) glp_erase_prob(dsa->lp); if (dsa->fp != NULL) xfclose(dsa->fp); return 1;}/*------------------------------------------------------------------------ write_freemps - write problem data in free MPS format.---- *Synopsis*---- #include "glpmps.h"-- int write_freemps(LPX *lp, const char *fname);---- *Description*---- The routine write_freemps writes problem data in free MPS format to-- an output text file whose name is the character string fname.---- *Returns*---- If the operation was successful, the routine returns zero. Otherwise-- the routine prints an error message and returns non-zero. */static char *mps_name(char name[255+1]){ int k; for (k = 0; name[k] != '\0'; k++) if (name[k] == ' ') name[k] = '_'; return name;}static char *row_name(LPX *lp, int i, char rname[255+1]){ const char *str; str = (i == 0 ? lpx_get_obj_name(lp) : lpx_get_row_name(lp, i)); if (str == NULL) sprintf(rname, "R%07d", i); else strcpy(rname, mps_name((void *)str)); return rname;}static char *col_name(LPX *lp, int j, char cname[8+1]){ const char *str; str = lpx_get_col_name(lp, j); if (str == NULL) sprintf(cname, "C%07d", j); else strcpy(cname, mps_name((void *)str)); return cname;}static char *mps_numb(double val, char numb[12+1]){ int n; char str[255+1], *e; for (n = 12; n >= 6; n--) { if (val != 0.0 && fabs(val) < 0.002)#if 0 sprintf(str, "%.*E", n, val);#else /* n is number of desired decimal places, but in case of E format precision means number of digits that follow the decimal point */ sprintf(str, "%.*E", n-1, val);#endif else sprintf(str, "%.*G", n, val); xassert(strlen(str) <= 255); e = strchr(str, 'E'); if (e != NULL) sprintf(e+1, "%d", atoi(e+1)); if (strlen(str) <= 12) return strcpy(numb, str); } xerror("glp_write_mps: unable to convert floating point number %g" " to character string\n", val); return NULL; /* make the compiler happy */}int write_freemps(LPX *lp, const char *fname){ XFILE *fp; int wide = lpx_get_int_parm(lp, LPX_K_MPSWIDE); int skip = lpx_get_int_parm(lp, LPX_K_MPSSKIP); int marker = 0; /* intorg/intend marker count */ int mip, make_obj, nrows, ncols, i, j, flag, *ndx; double *obj, *val; char rname[255+1], cname[255+1], numb[12+1]; xprintf("glp_write_mps: writing problem data to `%s'...\n", fname); /* open the output text file */ fp = xfopen(fname, "w"); if (fp == NULL) { xprintf("glp_write_mps: unable to create `%s' - %s\n", fname, strerror(errno)); goto fail; } /* determine whether the problem is LP or MIP */ mip = (lpx_get_class(lp) == LPX_MIP); /* determine number of rows and number of columns */ nrows = lpx_get_num_rows(lp); ncols = lpx_get_num_cols(lp); /* the problem should contain at least one row and one column */ if (!(nrows > 0 && ncols > 0)) xerror("glp_write_mps: problem has no rows/columns\n"); /* determine if the routine should output the objective row */ make_obj = lpx_get_int_parm(lp, LPX_K_MPSOBJ); if (make_obj == 2) { for (i = 1; i <= nrows; i++) { int typx; lpx_get_row_bnds(lp, i, &typx, NULL, NULL); if (typx == LPX_FR) { make_obj = 0; break; } } } /* write comment records (if required) */ if (lpx_get_int_parm(lp, LPX_K_MPSINFO)) { const char *name = lpx_get_prob_name(lp); if (name == NULL) name = "UNKNOWN"; xfprintf(fp, "* Problem: %s\n", name); xfprintf(fp, "* Class: %s\n", !mip ? "LP" : "MIP"); xfprintf(fp, "* Rows: %d\n", nrows); if (!mip) xfprintf(fp, "* Columns: %d\n", ncols); else xfprintf(fp, "* Columns: %d (%d integer, %d binary)\n", ncols, lpx_get_num_int(lp), lpx_get_num_bin(lp)); xfprintf(fp, "* Non-zeros: %d\n", lpx_get_num_nz(lp)); xfprintf(fp, "* Format: Free MPS\n"); xfprintf(fp, "*\n"); } /* write NAME indicator record */ { const char *name = lpx_get_prob_name(lp); if (name == NULL) xfprintf(fp, "NAME\n"); else xfprintf(fp, "NAME %s\n", mps_name((void *)name)); } /* write ROWS section */ xfprintf(fp, "ROWS\n"); if (make_obj) xfprintf(fp, " %c %s\n", 'N', row_name(lp, 0, rname)); for (i = 1; i <= nrows; i++) { int typx; lpx_get_row_bnds(lp, i, &typx, NULL, NULL); switch (typx) { case LPX_FR: typx = 'N'; break; case LPX_LO: typx = 'G'; break; case LPX_UP: typx = 'L'; break; case LPX_DB: typx = 'E'; break; case LPX_FX: typx = 'E'; break; default: xassert(typx != typx); } xfprintf(fp, " %c %s\n", typx, row_name(lp, i, rname)); } /* prepare coefficients of the objective function */ obj = xcalloc(1+ncols, sizeof(double)); obj[0] = lpx_get_obj_coef(lp, 0); for (j = 1; j <= ncols; j++) obj[j] = lpx_get_obj_coef(lp, j); ndx = xcalloc(1+ncols, sizeof(int)); val = xcalloc(1+ncols, sizeof(double)); for (i = 1; i <= nrows; i++)#if 0 { double ci = lpx_get_row_coef(lp, i);#else { double ci = 0.0;#endif if (ci != 0.0) { int len, t; len = lpx_get_mat_row(lp, i, ndx, val); for (t = 1; t <= len; t++) obj[ndx[t]] += ci * val[t]; } } xfree(ndx); xfree(val); for (j = 0; j <= ncols; j++) if (fabs(obj[j]) < 1e-12) obj[j] = 0.0; /* write COLUMNS section */ xfprintf(fp, "COLUMNS\n"); ndx = xcalloc(1+nrows, sizeof(int)); val = xcalloc(1+nrows, sizeof(double)); for (j = 1; j <= ncols; j++) { int nl = 1, iv, len, t; col_name(lp, j, cname); iv = (mip && lpx_get_col_kind(lp, j) == LPX_IV); if (iv && marker % 2 == 0) { /* open new intorg/intend group */ marker++; xfprintf(fp, " M%07d 'MARKER' 'INTORG'\n", marker); } else if (!iv && marker % 2 == 1) { /* close the current intorg/intend group */ marker++; xfprintf(fp, " M%07d 'MARKER' 'INTEND'\n", marker); } /* obtain j-th column of the constraint matrix */ len = lpx_get_mat_col(lp, j, ndx, val); ndx[0] = 0; val[0] = (make_obj ? obj[j] : 0.0); if (len == 0 && val[0] == 0.0 && !skip) xfprintf(fp, " %s %s %s $ empty column\n", cname, row_name(lp, 1, rname), mps_numb(0.0, numb)); for (t = val[0] != 0.0 ? 0 : 1; t <= len; t++) { if (nl) xfprintf(fp, " %s", cname); xfprintf(fp, " %s %s", row_name(lp, ndx[t], rname), mps_numb(val[t], numb)); if (wide) nl = 1 - nl; if (nl) xfprintf(fp, "\n"); } if (!nl) xfprintf(fp, "\n"); } if (marker % 2 == 1) { /* close the last intorg/intend group (if not closed) */ marker++; xfprintf(fp, " M%07d 'MARKER' 'INTEND'\n", marker); } xfree(ndx); xfree(val); /* write RHS section */ flag = 0; { int nl = 1; for (i = make_obj ? 0 : 1; i <= nrows; i++) { int typx; double lb, ub, rhs; if (i == 0) typx = LPX_FR, lb = ub = 0.0; else lpx_get_row_bnds(lp, i, &typx, &lb, &ub); switch (typx) { case LPX_FR: rhs = (make_obj && i == 0 ? obj[0] : 0.0); break; case LPX_LO: rhs = lb; break; case LPX_UP: rhs = ub; break; case LPX_DB: rhs = (ub > 0.0 ? lb : ub); break; case LPX_FX: rhs = lb; break; default: xassert(typx != typx); } if (rhs == 0.0) continue; if (!flag) xfprintf(fp, "RHS\n"), flag = 1; if (nl) xfprintf(fp, " RHS1"); xfprintf(fp, " %s %s", row_name(lp, i, rname), mps_numb(rhs, numb)); if (wide) nl = 1 - nl; if (nl) xfprintf(fp, "\n"); } if (!nl) xfprintf(fp, "\n"); } xfree(obj); /* write RANGES section */ flag = 0; { int nl = 1; for (i = 1; i <= nrows; i++) { int typx; double lb, ub, rng; lpx_get_row_bnds(lp, i, &typx, &lb, &ub); if (typx != LPX_DB) continue; if (!flag) xfprintf(fp, "RANGES\n"), flag = 1; if (nl) xfprintf(fp, " RNG1"); rng = (ub > 0.0 ? ub - lb : lb - ub); xfprintf(fp, " %s %s", row_name(lp, i, rname), mps_numb(rng, numb)); if (wide) nl = 1 - nl; if (nl) xfprintf(fp, "\n"); } if (!nl) xfprintf(fp, "\n"); } /* write BOUNDS section */ flag = 0; { for (j = 1; j <= ncols; j++) { int typx; double lb, ub; lpx_get_col_bnds(lp, j, &typx, &lb, &ub); if (typx == LPX_LO && lb == 0.0) continue; if (!flag) xfprintf(fp, "BOUNDS\n"), flag = 1; switch (typx) { case LPX_FR: xfprintf(fp, " FR BND1 %s\n", col_name(lp, j, cname)); break; case LPX_LO: xfprintf(fp, " LO BND1 %s %s\n", col_name(lp, j, cname), mps_numb(lb, numb)); break; case LPX_UP: xfprintf(fp, " MI BND1 %s\n", col_name(lp, j, cname)); xfprintf(fp, " UP BND1 %s %s\n", col_name(lp, j, cname), mps_numb(ub, numb)); break; case LPX_DB: if (lb != 0.0) xfprintf(fp, " LO BND1 %s %s\n", col_name(lp, j, cname), mps_numb(lb, numb)); xfprintf(fp, " UP BND1 %s %s\n", col_name(lp, j, cname), mps_numb(ub, numb)); break; case LPX_FX: xfprintf(fp, " FX BND1 %s %s\n", col_name(lp, j, cname), mps_numb(lb, numb)); break; default: xassert(typx != typx); } } } /* write ENDATA indicator record */ xfprintf(fp, "ENDATA\n"); /* close the output text file */ xfflush(fp); if (xferror(fp)) { xprintf("lpx_write_freemps: write error on `%s' - %s\n", fname, strerror(errno)); goto fail; } xfclose(fp); /* return to the calling program */ return 0;fail: /* the operation failed */ if (fp != NULL) xfclose(fp); return 1;}/* eof */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -