static void parse_objective(struct dsa *dsa) { /* parse objective sense */ int k, len; /* parse the keyword 'minimize' or 'maximize' */ if (dsa->token == T_MINIMIZE) lpx_set_obj_dir(dsa->lp, LPX_MIN); else if (dsa->token == T_MAXIMIZE) lpx_set_obj_dir(dsa->lp, LPX_MAX); else xassert(dsa != dsa); scan_token(dsa); /* parse objective name */ if (dsa->token == T_NAME && dsa->c == ':') { /* objective name is followed by a colon */ lpx_set_obj_name(dsa->lp, dsa->image); scan_token(dsa); xassert(dsa->token == T_COLON); scan_token(dsa); } else { /* objective name is not specified; use default */ lpx_set_obj_name(dsa->lp, "obj"); } /* parse linear form */ len = parse_linear_form(dsa); for (k = 1; k <= len; k++) lpx_set_obj_coef(dsa->lp, dsa->ind[k], dsa->val[k]); return; }
static void parse_constraints(struct csa *csa) { int i, len, type; double s; /* parse the keyword 'subject to' */ xassert(csa->token == T_SUBJECT_TO); scan_token(csa); loop: /* create new row (constraint) */ i = glp_add_rows(csa->P, 1); /* parse row name */ if (csa->token == T_NAME && csa->c == ':') { /* row name is followed by a colon */ if (glp_find_row(csa->P, csa->image) != 0) error(csa, "constraint '%s' multiply defined\n", csa->image); glp_set_row_name(csa->P, i, csa->image); scan_token(csa); xassert(csa->token == T_COLON); scan_token(csa); } else { /* row name is not specified; use default */ char name[50]; sprintf(name, "r.%d", csa->count); glp_set_row_name(csa->P, i, name); } /* parse linear form */ len = parse_linear_form(csa); glp_set_mat_row(csa->P, i, len, csa->ind, csa->val); /* parse constraint sense */ if (csa->token == T_LE) type = GLP_UP, scan_token(csa); else if (csa->token == T_GE) type = GLP_LO, scan_token(csa); else if (csa->token == T_EQ) type = GLP_FX, scan_token(csa); else error(csa, "missing constraint sense\n"); /* parse right-hand side */ if (csa->token == T_PLUS) s = +1.0, scan_token(csa); else if (csa->token == T_MINUS) s = -1.0, scan_token(csa); else s = +1.0; if (csa->token != T_NUMBER) error(csa, "missing right-hand side\n"); glp_set_row_bnds(csa->P, i, type, s * csa->value, s * csa->value); /* the rest of the current line must be empty */ if (!(csa->c == '\n' || csa->c == EOF)) error(csa, "invalid symbol(s) beyond right-hand side\n"); scan_token(csa); /* if the next token is a sign, numeric constant, or a symbolic name, here is another constraint */ if (csa->token == T_PLUS || csa->token == T_MINUS || csa->token == T_NUMBER || csa->token == T_NAME) goto loop; return; }
static void parse_constraints(struct dsa *dsa) { int i, len, type; double s; /* parse the keyword 'subject to' */ xassert(dsa->token == T_SUBJECT_TO); scan_token(dsa); loop: /* create new row (constraint) */ i = lpx_add_rows(dsa->lp, 1); /* parse row name */ if (dsa->token == T_NAME && dsa->c == ':') { /* row name is followed by a colon */ if (lpx_find_row(dsa->lp, dsa->image) != 0) fatal(dsa, "constraint `%s' multiply defined", dsa->image); lpx_set_row_name(dsa->lp, i, dsa->image); scan_token(dsa); xassert(dsa->token == T_COLON); scan_token(dsa); } else { /* row name is not specified; use default */ char name[50]; sprintf(name, "r.%d", dsa->count); lpx_set_row_name(dsa->lp, i, name); } /* parse linear form */ len = parse_linear_form(dsa); lpx_set_mat_row(dsa->lp, i, len, dsa->ind, dsa->val); /* parse constraint sense */ if (dsa->token == T_LE) type = LPX_UP, scan_token(dsa); else if (dsa->token == T_GE) type = LPX_LO, scan_token(dsa); else if (dsa->token == T_EQ) type = LPX_FX, scan_token(dsa); else fatal(dsa, "missing constraint sense"); /* parse right-hand side */ if (dsa->token == T_PLUS) s = +1.0, scan_token(dsa); else if (dsa->token == T_MINUS) s = -1.0, scan_token(dsa); else s = +1.0; if (dsa->token != T_NUMBER) fatal(dsa, "missing right-hand side"); switch (type) { case LPX_LO: lpx_set_row_bnds(dsa->lp, i, LPX_LO, s * dsa->value, 0.0); break; case LPX_UP: lpx_set_row_bnds(dsa->lp, i, LPX_UP, 0.0, s * dsa->value); break; case LPX_FX: lpx_set_row_bnds(dsa->lp, i, LPX_FX, s * dsa->value, 0.0); break; } /* the rest of the current line must be empty */ if (!(dsa->c == '\n' || dsa->c == EOF)) fatal(dsa, "invalid symbol(s) beyond right-hand side"); scan_token(dsa); /* if the next token is a sign, numeric constant, or a symbolic name, here is another constraint */ if (dsa->token == T_PLUS || dsa->token == T_MINUS || dsa->token == T_NUMBER || dsa->token == T_NAME) goto loop; return; }