NAG Library Routine Document
h02buf (ilp_mpsx_convert)
1
Purpose
h02buf reads data for a linear or integer programming problem from an external file which is in standard or compatible MPSX input format.
2
Specification
Fortran Interface
Subroutine h02buf ( |
infile, maxn, maxm, optim, xbldef, xbudef, nmobj, nmrhs, nmrng, nmbnd, mpslst, n, m, a, bl, bu, cvec, x, intvar, crname, nmprob, iwork, ifail) |
Integer, Intent (In) | :: | infile, maxn, maxm | Integer, Intent (Inout) | :: | ifail | Integer, Intent (Out) | :: | n, m, intvar(maxn), iwork(maxn+maxm) | Real (Kind=nag_wp), Intent (In) | :: | xbldef, xbudef | Real (Kind=nag_wp), Intent (Out) | :: | a(maxm,maxn), bl(maxn+maxm), bu(maxn+maxm), cvec(maxn), x(maxn) | Logical, Intent (In) | :: | mpslst | Character (3), Intent (In) | :: | optim | Character (8), Intent (Inout) | :: | nmobj, nmrhs, nmrng, nmbnd | Character (8), Intent (Out) | :: | crname(maxn+maxm), nmprob |
|
C Header Interface
#include <nagmk26.h>
void |
h02buf_ (const Integer *infile, const Integer *maxn, const Integer *maxm, const char *optim, const double *xbldef, const double *xbudef, char *nmobj, char *nmrhs, char *nmrng, char *nmbnd, const logical *mpslst, Integer *n, Integer *m, double a[], double bl[], double bu[], double cvec[], double x[], Integer intvar[], char crname[], char *nmprob, Integer iwork[], Integer *ifail, const Charlen length_optim, const Charlen length_nmobj, const Charlen length_nmrhs, const Charlen length_nmrng, const Charlen length_nmbnd, const Charlen length_crname, const Charlen length_nmprob) |
|
3
Description
h02buf reads linear programming (LP) or integer programming (IP) problem data from an external file which is prepared in standard or compatible MPSX (see
IBM (1971)) input format and then initializes
(the number of variables),
(the number of general linear constraints), the vectors
,
and
and the
by
matrix
for use with
e04mff/e04mfa or
h02bbf, which are designed to solve problems of the form
h02buf may be followed by calls to either
e04mff/e04mfa (to solve an LP problem) or
h02bbf and
h02bzf (to solve an IP problem), possibly followed by a call to
h02bvf (to print the solution using MPSX names).
Note that
h02buf uses an ‘infinite’ bound size of
in the definition of
and
. In other words, any element of
greater than or equal to
will be regarded as
(and similarly any element of
less than or equal to
will be regarded as
). If this value is deemed to be ‘inappropriate’, you are recommended to reset the value of either the optional parameter
Infinite Bound Size (if an LP problem is being solved) or the argument BIGBND (if an IP problem is being solved) and make any necessary changes to
bl and/or
bu prior to calling
e04mff/e04mfa or
h02bbf (as appropriate).
The documents for
e04mff/e04mfa,
h02bvf and/or
h02bbf and
h02bzf should be consulted for further details.
MPSX input format
The input file of data may only contain two types of lines.
1. |
Indicator lines (specifying the type of data which is to follow). |
2. |
Data lines (specifying the actual data). |
The input file must not contain any blank lines. Any characters beyond column 80 are ignored. Indicator lines must not contain leading blank characters (in other words they must begin in column 1). The following displays the order in which the indicator lines must appear in the file:
NAME |
user-given name |
ROWS |
data line(s) |
COLUMNS |
data line(s) |
RHS |
data line(s) |
RANGES (optional) |
data line(s) |
BOUNDS (optional) |
data line(s) |
ENDATA |
|
The ‘user-given name’ specifies a name for the problem and must occupy columns 15–22. The name can either be blank or up to a maximum of characters.
A data line follows the same fixed format made up of fields defined below. The contents of the fields may have different significance depending upon the section of data in which they appear.
|
|
Field 1 |
Field 2 |
Field 3 |
Field 4 |
Field 5 |
Field 6 |
Columns |
|
|
|
|
|
|
Contents |
Code |
Name |
Name |
Value |
Name |
Value |
The names and codes consist of ‘alphanumeric’ characters (i.e., a–z, A–Z,
–
,
,
, asterisk (*), blank ( ), colon (:), dollar sign ($) or fullstop (.) only) and the names must not contain leading blank characters. Values are read using Fortran format E12.0. This allows values to be entered in several equivalent forms. For example,
,
,
and
all represent the same number. It is safest to include an explicit decimal point.
Note that in order to ensure numeric values are interpreted as intended, they should be
right-justified in the
-character field, with no trailing blanks. This is because in some situations trailing blanks may be interpreted as zeros and this can dramatically affect the interpretation of the value. This is relevant if the value contains an exponent, or if it contains neither an exponent nor an explicit decimal point. For example, the fields
%%%%1.23E-2%
%%%%%%%123%%
may be interpreted as
and
respectively (where
% is used to denote a blank). The actual behaviour is system-dependent.
Comment lines are allowed in the data file. These must have an asterisk (*) in column 1 and any characters in columns 2–80. In any data line, a dollar sign ($) as the first character in Field 3 or 5 indicates that the information from that point through column 80 consists of comments.
Columns outside the six fields must be blank, except for columns 72–80, whose contents are ignored by the routine. These columns may be used to enter a sequence number. A non-blank character outside the predefined six fields and columns 72–80 is considered to be a major error (
; see
Section 6), unless it is part of a comment.
ROWS data line(s)
These lines specify row (constraint) names and their inequality types (i.e.,
,
or
).
Field 1: |
defines the constraint type. It may be in column 2 or column 3. |
N |
free row, that is no constraint. It may be used to define the objective row. |
G |
greater than or equal to (i.e., ). |
L |
less than or equal to (i.e., ). |
E |
exactly equal to (i.e., ). |
Field 2: |
defines the row name. |
Row type
N stands for ‘Not binding’, also known as ‘Free’. It can be used to define the objective row. The objective row is a free row that specifies the vector
in the objective function. It is taken to be the first free row, unless some other free row name is specified by the argument
nmobj (see
Section 5). Note that the objective function must be included in the MPSX data file. Thus the maximum number of constraints (
maxm; see
Section 5) in the problem must be
.
COLUMNS data line(s)
These lines specify the names to be assigned to the variables (columns) in the constraint matrix
, and define, in terms of column vectors, the actual values of the corresponding matrix elements.
|
Field 1: blank (ignored) |
|
Field 2: gives the name of the column associated with the elements specified in the following fields. |
|
Field 3: contains the name of a row. |
|
Field 4: used in conjunction with Field 3 contains the value of the matrix element. |
|
Field 5: is optional (may be used like Field 3). |
|
Field 6: is optional (may be used like Field 4). |
Note that only nonzero elements of need to be specified in the COLUMNS section, as any unspecified elements are assumed to be zero.
RHS data line(s)
This section specifies the right-hand side values of the constraint matrix . The lines specify the name of the RHS (right-hand side) vector given to the problem, the numerical values of the elements of the vector are also defined by the data lines and may appear in any order. The data lines have exactly the same format as the COLUMNS data lines, except that the column name is replaced by the RHS name. Note that any unspecified elements are assumed to be zero.
RANGES data line(s) (optional)
Ranges are used for constraints of the form , where and are finite. The range of the constraint is . Either or must be specified in the RHS section and must be defined in this section.
The data lines have exactly the same format as the COLUMNS data lines, except that the column name is replaced by the RANGES name.
BOUNDS data line(s) (optional)
These lines specify limits on the values of the variables (
and
in
). If the variable is not specified in the bound set then it is automatically assumed to lie between default lower and upper bounds (usually
and
). Like an RHS column which is given a name, the set of variables in one bound set is also given a name.
Field 1: |
specifies the type of bound or defines the variable type. |
LO |
lower bound |
UP |
upper bound |
FX |
fixed variable |
FR |
free variable ( to ) |
MI |
lower bound is |
PL |
upper bound is . This is the default variable type. |
Field 2: |
identifies a name for the bound set. |
Field 3: |
identifies the column name of the variable belonging to this set. |
Field 4: |
identifies the value of the bound; this has a numerical value only in association with LO, UP, FX in Field 1, otherwise it is blank. |
Field 5: |
is blank and ignored. |
Field 6: |
is blank and ignored. |
Note that if RANGES and BOUNDS sections are both present, the RANGES section must appear first.
Integer Problems
In IP problems there are two common integer variable types.
1. |
–1 integer variables which represent ‘on’ or ‘off’ situations and |
2. |
General integer variables which are forced to take an integer value, in a specified range, at the optimal integer solution. |
Integer variables can be defined in the following compatible and standard MPSX forms.
In the compatible MPSX format, the type of integer variables is defined in Field 1 of the BOUNDS section, that is:
Field 1: |
specifies the type of the integer variable. |
BV |
integer variable (bound value is ). |
UI |
general integer variable (bound value is in Field 4). |
In the standard MPSX format, the integer variables are treated the same as the ‘ordinary’ bounded variables, in the BOUNDS section. Integer markers are, however, introduced in the COLUMNS section to specify the integer variables. The indicator lines for these markers are:
|
|
Field 1 |
Field 2 |
Field 3 |
Field 4 |
Field 5 |
Field 6 |
Columns |
|
|
|
|
|
|
Contents |
|
INTEGER |
‘MARKER’ |
|
‘INTORG’ |
|
to mark the beginning of the integer variables and
|
|
Field 1 |
Field 2 |
Field 3 |
Field 4 |
Field 5 |
Field 6 |
Columns |
|
|
|
|
|
|
Contents |
|
INTEGER |
‘MARKER’ |
|
‘INTEND’ |
|
to mark the end. That is, any variables between these markers are treated as integer variables. Note that if the (INTEND) indicator line is not specified in the file then all the variables between the (INTORG) indicator line and the end of the COLUMNS section are assumed to be integer variables. The routine accepts both standard and/or compatible MPSX format as a means of specifying integer variables. This is illustrated in
Section 10.2 in
h02bff.
4
References
IBM (1971) MPSX – Mathematical programming system Program Number 5734 XM4 IBM Trade Corporation, New York
5
Arguments
- 1: – IntegerInput
-
On entry: the unit number associated with the MPSX data file.
Constraint:
.
- 2: – IntegerInput
-
On entry: an upper limit for the number of variables in the problem.
Constraint:
.
- 3: – IntegerInput
-
On entry: an upper limit for the number of constraints (including the objective) in the problem.
Constraint:
.
- 4: – Character(3)Input
-
On entry: specifies the direction of the optimization.
optim must be set to 'MIN' for minimization and to 'MAX' for maximization.
Constraint:
or .
- 5: – Real (Kind=nag_wp)Input
-
On entry: the default lower bound to be used for the variables in the problem when none is specified in the BOUNDS section of the MPSX data file. For a standard LP or IP problem
xbldef would normally be set to zero.
- 6: – Real (Kind=nag_wp)Input
-
On entry: the default upper bound to be used for the variables in the problem when none is specified in the BOUNDS section of the MPSX data file. For a standard LP or IP problem
xbudef would normally be set to ‘infinity’ (i.e.,
).
Constraint:
.
- 7: – Character(8)Input/Output
-
On entry: either the name of the objective function to be used for the optimization, or blank (in which case the first objective (free) row in the file is used).
On exit: the name of the objective row as defined in the MPSX data file.
- 8: – Character(8)Input/Output
-
On entry: either the name of the RHS set to be used for the optimization, or blank (in which case the first RHS set is used).
On exit: the name of the RHS set read in the MPSX data file.
- 9: – Character(8)Input/Output
-
On entry: either the name of the RANGE set to be used for the optimization, or blank (in which case the first RANGE set (if any) is used).
On exit: the name of the RANGE set read in the MPSX data file. This is blank if the MPSX data file does not have a RANGE set.
- 10: – Character(8)Input/Output
-
On entry: either the name of the BOUNDS set to be used for the optimization, or blank (in which case the first BOUNDS set (if any) is used).
On exit: the name of the BOUNDS set read in the MPSX data file. This is blank if the MPSX data file does not have a BOUNDS set.
- 11: – LogicalInput
-
On entry: if
, then a listing of the input data is sent to the current advisory message unit (as defined by
x04abf). This can be useful for debugging the MPSX data file.
- 12: – IntegerOutput
-
On exit: , the actual number of variables in the problem.
- 13: – IntegerOutput
-
On exit: , the actual number of general linear constraints in the problem.
- 14: – Real (Kind=nag_wp) arrayOutput
-
On exit: , the matrix of general linear constraints.
- 15: – Real (Kind=nag_wp) arrayOutput
-
On exit:
, the lower bounds for all the variables and constraints in the following order. The first
n elements of
bl contain the bounds on the variables and the next
m elements contain the bounds for the general linear constraints (if any). Note that an ‘infinite’ lower bound is indicated by
and an equality constraint by
.
- 16: – Real (Kind=nag_wp) arrayOutput
-
On exit:
, the upper bounds for all the variables and constraints in the following order. The first
n elements of
bu contain the bounds on the variables and the next
m elements contain the bounds for the general linear constraints (if any). Note that an ‘infinite’ upper bound is indicated by
and an equality constraint by
.
- 17: – Real (Kind=nag_wp) arrayOutput
-
On exit:
, the coefficients of the objective function. The signs of these coefficients are determined by the problem (either LP or IP) and the direction of the optimization (see
optim above).
- 18: – Real (Kind=nag_wp) arrayOutput
-
On exit: an initial estimate of the solution to the problem. More precisely,
if is odd and otherwise, for .
- 19: – Integer arrayOutput
-
On exit: indicates which are the integer variables in the problem. More precisely,
if is an integer variable, and otherwise, for .
- 20: – Character(8) arrayOutput
-
On exit: the MPSX names of all the variables and constraints in the problem in the following order. The first
n elements contain the MPSX names for the variables and the next
m elements contain the MPSX names for the general linear constraints (if any).
- 21: – Character(8)Output
-
On exit: the name of the problem as defined in the MPSX data file.
- 22: – Integer arrayWorkspace
-
- 23: – IntegerInput/Output
-
On entry:
ifail must be set to
,
. If you are unfamiliar with this argument you should refer to
Section 3.4 in How to Use the NAG Library and its Documentation for details.
For environments where it might be inappropriate to halt program execution when an error is detected, the value
is recommended. If the output of error messages is undesirable, then the value
is recommended. Otherwise, if you are not familiar with this argument, the recommended value is
.
When the value is used it is essential to test the value of ifail on exit.
On exit:
unless the routine detects an error or a warning has been flagged (see
Section 6).
6
Error Indicators and Warnings
If on entry
or
, explanatory error messages are output on the current error message unit (as defined by
x04aaf).
Errors or warnings detected by the routine:
to
(apart from
) are caused by having either a corrupt or a nonstandard MPSX data file. Refer to
Section 3 for a detailed description of the MPSX format which can be read by
h02buf. If
, the last line of printed output refers to the line in the MPSX data file which contains the reported error.
-
There are too many rows present in the data file. Increase
maxm by at least (
) and rerun
h02buf.
-
There are too many columns present in the data file. Increase
maxn by at least (
) and rerun
h02buf.
-
The objective function row was not found. There must be at least one row in the ROWS section with row type
n for the objective row.
-
There are no rows specified in the ROWS section.
-
An illegal constraint type was detected in the ROWS section. The constraint type must be one of N, L, G or E.
-
An illegal row name was detected in the ROWS section. Names must be made up of alphanumeric characters with no leading blanks.
-
An illegal column name was detected in the COLUMNS section. Names must be made up of alphanumeric characters with no leading blanks.
-
An illegal bound type was detected in the BOUNDS section. The bound type must be one of LO, UP, FX, FR, MI, PL, BV or UI.
-
An unknown column name was detected in the BOUNDS section. All the column names must be specified in the COLUMNS section.
-
The last line in the file does not contain the ENDATA line indicator.
-
An illegal data line was detected in the file. This line is neither a comment line nor a valid data line.
-
An unknown row name was detected in COLUMNS or RHS or RANGES section. All the row names must be specified in the ROWS section.
-
There were no columns specified in the COLUMNS section.
-
An input argument is invalid.
-
Incorrect integer marker. In standard MPSX data format, integer variables should be defined between INTORG and INTEND markers.
An unexpected error has been triggered by this routine. Please
contact
NAG.
See
Section 3.9 in How to Use the NAG Library and its Documentation for further information.
Your licence key may have expired or may not have been installed correctly.
See
Section 3.8 in How to Use the NAG Library and its Documentation for further information.
Dynamic memory allocation failed.
See
Section 3.7 in How to Use the NAG Library and its Documentation for further information.
7
Accuracy
Not applicable.
8
Parallelism and Performance
h02buf is not threaded in any implementation.
None.
10
Example
This example solves the same problem as the example for
h02bff, except that it treats it as an LP problem.
One of the applications of linear programming is to the so-called diet problem. Given the nutritional content of a selection of foods, the cost of each food, the amount available of each food and the consumer's minimum daily nutritonal requirements, the problem is to find the cheapest combination. This gives rise to the following problem:
minimize
subject to
where
and
The rows of correspond to energy, protein and calcium and the columns of correspond to oatmeal, chicken, eggs, milk, pie and bacon respectively.
The MPSX representation of the problem is given in
Section 10.2.
10.1
Program Text
Program Text (h02bufe.f90)
10.2
Program Data
Program Options (h02bufe.opt)
10.3
Program Results
Program Results (h02bufe.r)