The Knitro MPS file reader
Knitro implements a MPS file reader to import optimization problems specified in MPS and extended MPS formats. Knitro’s parser uses by default the free format MPS-style, but supports as well the fixed MPS format.
Note that MPS files should be encoded as ASCII files.
To ensure that Knitro parses correctly the MPS file, the names of rows and columns should not have any blank spaces.
CORRECT:
name_variable
UNCORRECT:
name variable
The maximal length of a variable’s
name is set by default at 512 (the user can set the KN_MPS_LENGTH_NAME
option to change this setting).
Free MPS format
Example
An example of a MPS file is given below:
NAME TESTPROB
ROWS
N COST
L LIM1
G LIM2
E MYEQN
COLUMNS
XONE COST 1 LIM1 1
XONE LIM2 1
YTWO COST 4 LIM1 1
YTWO MYEQN -1
ZTHREE COST 9 LIM2 1
ZTHREE MYEQN 1
RHS
RHS1 LIM1 5 LIM2 10
RHS1 MYEQN 7
BOUNDS
UP BND1 XONE 4
LO BND1 YTWO -1
UP BND1 YTWO 1
ENDATA
We discuss hereafter the different flags used in the (extended) free MPS format.
In the sequel, _
indicates a blank space.
NAME
Name of the problem. This section contains at most one line.
OBJSENSE (optional)
Sense of the objective function. This section contains at most one line with shape
SENSE
SENSE
specifies the objective’s sense, with value being either
MAX
MIN
By default, the sense is set at MIN
.
OBJNAME (optional)
Name of the objective. This section contains at most one line. By default, no name is set.
ROWS
In this section, each line specifies a row of the problem with shape
_S rowname
The S
character specifies the sense of the current row,
with possible values being
E equality constraint
G greater than equal
L less than equal
N non specified
The objective line is specified by a N
flag. If more than one line has
a N
flag, the objective is assumed to be the first N
flag encountered.
COLUMNS
Each line in this section specifies a column of the problem with shape
_cname1 rname1 value1 [rname2] [value2]
With
cname1 name of the variable corresponding to current row
rname1 name of a constraint where the row appears
value1 numerical values corresponding to row's coefficient in constraint
[rname2] name of a second constraint where the row appears
[value2] numerical values corresponding to row's coefficient in second constraint
Elements inside brackets []
are optional.
Note that rname1
and rname2
should be present in the ROWS
section.
Columns’ names should be consecutive. Otherwise, the MPS file could not be parsed correctly.
CORRECT:
_cname1
_cname1
_cname2
UNCORRECT:
_cname1
_cname2
_cname1
RHS (optional)
This section specifies the right-hand side of the different constraints. Each line is shaped
_name cname1 value1 [cname2] [value2]
with
name name of the RHS vector
cname1 name of a constraint
value1 right-hand side of this constraint
[cname1] name of a second constraint
[value1] right-hand side of this second constraint
Elements inside brackets []
are optional.
cname1
and cname2
should be present in the ROWS
section.
If a constraint cname
presents in the ROWS
section does not
appear in RHS
, its right-hand side is set at 0 by default.
BOUNDS (optional)
This section specifies the upper and lower bounds for the variables
defined in the COLUMNS
section. By default, if no bound is specified,
the lower bound LB
is set equal to 0
and the upper bound UB
is
set equal to KN_INFINITY
.
Each line has the form
_BO vname value
with vname
the name of the variable, BO
the nature of the bounds,
defined as
FR Free variable
FX Fixed variable
LO Lower bound
UP Upper bound
MI Minus infinity
PL Plus infinity
If the same variable appears several times, additional values would be discarded.
Additional values exist to specify integer/binary variables: .. code-block:: none
FR Free variable BV Binary variable UI Upper-bounded integer variable LI Lower-bounded integer variable
RANGES (optional)
This section specifies constraints that lie inside an interval between two values.
A line inside the RANGES
section has shape:
_T row1 value1 [row2] [value2]
with [row2]
and [value2]
optional values.
T
is the right-hand side specifier.
We have the following possibilities used in the RHS
section.
Row type |
Sign |
RHS lower limit |
RHS upper limit |
---|---|---|---|
G |
+/- |
rhs |
rhs + range |
L |
+/- |
rhs - range |
rhs |
E |
+ |
rhs |
rhs + range |
E |
- |
rhs + range |
rhs |
For instance, the constraint
is encoded as
COLUMNS
L cons1
ROWS
x1 cons1 1
x2 cons1 2
x3 cons1 1
RHS
rhs cons1 30
RANGES
rhs cons1 15
QUADOBJ / QMATRIX (optional)
A quadratic objective function is specified either by a QUADOBJ
flag
or a QMATRIX
flag.
For each quadratic term, the format is
col1 col2 values
with col1
the name of the first variable and col2
the name
of the second variable, values
being the coefficient of the term
in the objective.
The quadratic matrix as an implicit factors of 0.5
.
For instance, the objective function
is encoded with QUADOBJ
as
QUADOBJ
x x 4
y y 18
x y 32
and with QMATRIX
as
QUADOBJ
x x 4
y y 18
x y 32
y x 32
The term y * x
is assumed implicit in QUADOBJ
, thus explaining
why the term is not doubled.
The names x
and y
should be defined in the COLUMNS
section.
QCMATRIX (optional)
Quadratic constraints are specified in QCMATRIX
sections. Each quadratic
constraint qc_index
is encoded by a dedicated QCMATRIX
flag:
QCMATRIX qc_index
some text...
Inside a QCMATRIX
flag, the format is similar as in
the QMATRIX
section, that is, the format of each line is
col1 col2 values
with col1
the name of the first variable, col2
the name
of the second variable, values
being the coefficient of the term
in the constraint.
The quadratic matrix defined must be symmetric.
The constraint
is encoded as
ROWS
L qc1
COLUMNS
x qc1 1
y qc1 0
QCMATRIX qc1
x x 2
y y 9
x y 16
y x 16
RHS
rhs1 qc1 12
ENDATA
For y
to be defined correctly, it must appear in the COLUMNS
section
even if it does not appear linearly in the qc1
constraint.
On the contrary of the QMATRIX
and QUADOBJ
section, no scaling
factor is applied to the definition of the constraint in the solver.
ENDATA (optional)
Specifies the end of the MPS file.
C example
In the callable library interface, a MPS file can be loaded through the KN_load_mps_file API function.
/*---- LOAD MPS FILE ----*/
if (KN_load_mps_file (kc, "file.mps") != 0)
exit( -1 );