📄 readmps.c
字号:
if(Debug) {
fprintf(stderr, "Rows line: ");
fprintf(stderr, "%s %s\n", field1, field2);
}
if(strcmp(field1, "N") == 0) {
if(!OF_found) { /* take the first N row as OF, ignore others */
set_row_name(Mlp, 0, field2);
OF_found = TRUE;
}
else if(!Unconstrained_rows_found) {
fprintf(stderr, "Unconstrained row %s will be ignored\n", field2);
fprintf(stderr,
"Further messages of this kind will be surpressed\n");
Unconstrained_rows_found = TRUE;
}
}
else if(strcmp(field1, "L") == 0) {
str_add_constraint(Mlp, "" ,LE ,0);
set_row_name(Mlp, Mlp->rows, field2);
}
else if(strcmp(field1, "G") == 0) {
str_add_constraint(Mlp, "" ,GE ,0);
set_row_name(Mlp, Mlp->rows, field2);
}
else if(strcmp(field1, "E") == 0) {
str_add_constraint(Mlp, "",EQ ,0);
set_row_name(Mlp, Mlp->rows, field2);
}
else {
fprintf(stderr, "Unknown relat '%s' on line %d\n", field1, Lineno);
exit(EXIT_FAILURE);
}
break;
case COLUMNS:
/* field2: variable; field3: constraint; field4: coef */
/* optional: field5: constraint; field6: coef */
if(Debug) {
fprintf(stderr, "Columns line: ");
fprintf(stderr, "%s %s %g %s %g\n", field2, field3, field4, field5,
field6);
}
if((items == 4) || (items == 6)) {
if (strcmp(field2, Last_col_name) != 0 && Column_ready) {
addmpscolumn();
strcpy(Last_col_name, field2);
Column_ready = TRUE;
}
else {
strcpy(Last_col_name, field2);
Column_ready = TRUE;
}
if((row = find_row(field3)) >= 0) {
Last_column[row] = (REAL)field4;
}
}
if(items == 6) {
if((row = find_row(field5)) >= 0) {
Last_column[row] = (REAL)field6;
}
}
if(items == 5) { /* there might be an INTEND or INTORG marker */
/* look for " <name> 'MARKER' 'INTORG'" */
/* or " <name> 'MARKER' 'INTEND'" */
if(strcmp(field3, "'MARKER'") ==0) {
addmpscolumn();
if(strcmp(field5, "'INTORG'") == 0) {
Int_section = TRUE;
if(Debug)
fprintf(stderr, "Switching to integer section\n");
}
else if(strcmp(field5, "'INTEND'") == 0) {
Int_section = FALSE;
if(Debug)
fprintf(stderr, "Switching to non-integer section\n");
}
else
fprintf(stderr, "Unknown marker (ignored) at line %d: %s\n",
Lineno, field5);
}
}
if((items != 4) && (items != 6) && (items != 5)) { /* Wrong! */
fprintf(stderr,
"Wrong number of items (%d) in COLUMNS section (line %d)\n",
items, Lineno);
exit(EXIT_FAILURE);
}
break;
case RHS:
/* field2: uninteresting name; field3: constraint name */
/* field4: value */
/* optional: field5: constraint name; field6: value */
if(Debug) {
fprintf(stderr, "RHS line: ");
fprintf(stderr, "%s %s %g %s %g\n", field2, field3, field4, field5,
field6);
}
if((items != 4) && (items != 6)) {
fprintf(stderr,
"Wrong number of items (%d) in RHS section line %d\n",
items, Lineno);
exit(EXIT_FAILURE);
}
if((row = find_row(field3)) >= 0) {
set_rh(Mlp, row, (REAL)field4);
}
if(items == 6) {
if((row = find_row(field5)) >= 0) {
set_rh(Mlp, row, (REAL)field6);
}
}
break;
case BOUNDS:
/* field1: bound type; field2: uninteresting name; */
/* field3: variable name; field4: value */
if(Debug) {
fprintf(stderr, "BOUNDS line: %s %s %s %g\n", field1, field2, field3,
field4);
}
var = find_var(field3);
if(strcmp(field1, "UP") == 0) {
/* upper bound */
set_upbo(Mlp, var, field4);
}
else if(strcmp(field1, "LO") == 0) {
/* lower bound */
set_lowbo(Mlp, var, field4);
}
else if(strcmp(field1, "FX") == 0) {
/* fixed, upper _and_ lower */
set_lowbo(Mlp, var, field4);
set_upbo(Mlp, var, field4);
}
else if(strcmp(field1, "PL") == 0)
/* normal, 0 <= var <= inf, do nothing */;
else if(strcmp(field1, "BV") == 0) { /* binary variable */
set_upbo(Mlp, var, 1);
set_int(Mlp, var, TRUE);
}
/* begging of AMPS bounds type UI and LI added by E.Imamura (CRIEPI) */
else if(strcmp(field1, "UI") == 0) { /* upper bound for integer variable */
set_upbo(Mlp, var, field4);
set_int(Mlp, var, TRUE);
}
else if(strcmp(field1, "UI") == 0) { /* lower bound for integer variable */
set_lowbo(Mlp, var, field4);
set_int(Mlp, var, TRUE);
}
/* end of AMPS bounds type UI and LI added by E.Imamura (CRIEPI) */
/* hack for free and negative variables. Ugly, and does not
always work. MB */
else if(strcmp(field1, "FR") == 0) { /* free variable */
fprintf(stderr,
"Free variable %s is split in a positive part %s and a negative part %s_\n",
field3, field3, field3);
get_column(Mlp, var, Last_column);
for (i = 0; i <= Mlp->rows; i++)
Last_column[i]*=-1;
add_column(Mlp, Last_column);
strcat(field3, "_");
set_col_name(Mlp, Mlp->columns, field3);
/* should lower and upper bounds of both variables be adjusted? What
if lower and upper bound are specified later? MB */
}
else if(strcmp(field1, "MI") == 0) { /* negative variable */
fprintf(stderr,
"Negative variable %s will be represented by - %s-\n",
field3, field3);
get_column(Mlp, var, Last_column);
del_column(Mlp, var);
for (i = 0; i <= Mlp->rows; i++)
Last_column[i] *= -1;
add_column(Mlp, Last_column);
strcat(field3, "-");
set_row_name(Mlp, var, field3);
/* should lower and upper bounds of variable be adjusted? What if
lower and upper bound are specified later? (does not work!) MB */
}
else {
fprintf(stderr, "BOUND type %s on line %d is not supported\n",
field1, Lineno);
exit(EXIT_FAILURE);
}
break;
case RANGES:
/* We have to implement the following semantics:
D. The RANGES section is for constraints of the form: h <=
constraint <= u . The range of the constraint is r = u - h . The
value of r is specified in the RANGES section, and the value of u or
h is specified in the RHS section. If b is the value entered in the
RHS section, and r is the value entered in the RANGES section, then
u and h are thus defined:
row type sign of r h u
----------------------------------------------
G + or - b b + |r|
L + or - b - |r| b
E + b b + |r|
E - b - |r| b
*/
/* field2: uninteresting name; field3: constraint name */
/* field4: value */
/* optional: field5: constraint name; field6: value */
if(Debug) {
fprintf(stderr, "RANGES line: ");
fprintf(stderr, "%s %s %g %s %g\n", field2, field3, field4, field5,
field6);
}
if((items != 4) && (items != 6)) {
fprintf(stderr,
"Wrong number of items (%d) in RANGES section line %d\n",
items, Lineno);
exit(EXIT_FAILURE);
}
if(((row = find_row(field3)) >= 0) && (field4 != 0)) {
/* find out constraint type. If ch_sign[row] is TRUE, it is GE. If
ch_sign[row] is FALSE, it is an equality constraint if
orig_upbo[row] == 0. For a LE constraint, orig_upbo[row] should be
+infinity */
if(my_abs(field4) >= Mlp->infinite) {
fprintf(stderr,
"Warning, Range for row %s >= infinity (value %g) on line %d, ignoring\n",
field3, field4, Lineno);
}
else if(Mlp->ch_sign[row]) {
/* GE */
Mlp->orig_upbo[row] = my_abs(field4);
}
else if(Mlp->orig_upbo[row] == 0 && field4 >= 0) {
/* EQ with positive sign of r value */
set_constr_type(Mlp, row, GE);
Mlp->orig_upbo[row] = field4;
}
else if(Mlp->orig_upbo[row] == Mlp->infinite) {
/* LE */
Mlp->orig_upbo[row] = my_abs(field4);
}
else if(Mlp->orig_upbo[row] == 0 && field4 < 0) {
/* EQ with negative sign of r value */
set_constr_type(Mlp, row, LE);
Mlp->orig_upbo[row] = -field4;
}
else { /* let's be paranoid */
fprintf(stderr,
"Cannot figure out row type, row = %d, ch_sign = %d, upbo = %g\n",
row, Mlp->ch_sign[row], (double)Mlp->orig_upbo[row]);
}
}
if(items == 6) {
if(((row = find_row(field5)) >= 0) && (field6 != 0)) {
/* find out constraint type. If ch_sign[row] is TRUE, it is GE. If
ch_sign[row] is FALSE, it is an equality constraint if
orig_upbo[row] == 0. For a LE constraint, orig_upbo[row] should
be +infinity */
if(my_abs(field6) >= Mlp->infinite) {
fprintf(stderr,
"Warning, Range for row %s >= infinity (value %g) on line %d, ignoring\n",
field5, field6, Lineno);
}
else if(Mlp->ch_sign[row]) {
/* GE */
Mlp->orig_upbo[row] = my_abs(field6);
}
else if(Mlp->orig_upbo[row] == 0 && field6 >= 0) {
/* EQ with positive sign of r value */
set_constr_type(Mlp, row, GE);
Mlp->orig_upbo[row] = field6;
}
else if(Mlp->orig_upbo[row] == Mlp->infinite) {
/* LE */
Mlp->orig_upbo[row] = my_abs(field6);
}
else if(Mlp->orig_upbo[row] == 0 && field6 < 0) {
/* EQ with negative sign of r value */
set_constr_type(Mlp, row, LE);
Mlp->orig_upbo[row] = -field6;
}
else { /* let's be paranoid */
fprintf(stderr,
"Cannot figure out row type, row = %d, ch_sign = %d, upbo = %g\n",
row, Mlp->ch_sign[row], (double)Mlp->orig_upbo[row]);
}
}
}
break;
}
}
}
return(Mlp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -