e04 Chapter Contents
e04 Chapter Introduction
NAG Library Manual

# NAG Library Function Documentnag_opt_miqp_mps_read (e04mxc)

## 1  Purpose

nag_opt_miqp_mps_read (e04mxc) reads data for sparse linear programming, mixed integer linear programming, quadratic programming or mixed integer quadratic programming problems from an external file which is in standard or compatible MPS input format.

## 2  Specification

 #include #include
 void nag_opt_miqp_mps_read (Nag_FileID fileid, Integer maxn, Integer maxm, Integer maxnnz, Integer maxncolh, Integer maxnnzh, Integer maxlintvar, Integer mpslst, Integer *n, Integer *m, Integer *nnz, Integer *ncolh, Integer *nnzh, Integer *lintvar, Integer *iobj, double a[], Integer irowa[], Integer iccola[], double bl[], double bu[], char pnames[][9], Integer *nname, char crname[][9], double h[], Integer irowh[], Integer iccolh[], Integer *minmax, Integer intvar[], NagError *fail)

## 3  Description

nag_opt_miqp_mps_read (e04mxc) reads data for linear programming (LP) or quadratic programming (QP) problems (or their mixed integer variants) from an external file which is prepared in standard or compatible MPS (see IBM (1971)) input format. It then initializes $n$ (the number of variables), $m$ (the number of general linear constraints), the $m$ by $n$ matrix $A$, the vectors $l$, $u$, $c$ (stored in row iobj of $A$) and the $n$ by $n$ Hessian matrix $H$ for use with nag_opt_sparse_convex_qp_solve (e04nqc). This function is designed to solve problems of the form
 $minimize x ⁡ cTx+12xTHx subject to l≤ x Ax ≤u.$

### 3.1  MPS 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).
A section is a combination of an indicator line and its corresponding data line(s). 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-supplied name (optional) OBJSENSE (optional) data line OBJNAME (optional) data line ROWS data line(s) COLUMNS data line(s) RHS data line(s) RANGES (optional) data line(s) BOUNDS (optional) data line(s) QUADOBJ (optional) data line(s) ENDATA
A data line follows a fixed format, being made up of fields as 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 $2–3$ $5–12$ $15–22$ $25–36$ $40–47$ $50–61$ Contents Code Name Name Value Name Value
Each name and code must consist of ‘printable’ characters only; names and codes supplied must match the case used in the following descriptions. Values are read using a field width of $12$. This allows values to be entered in several equivalent forms. For example, $1.2345678$, $\text{1.2345678e+0}$, $\text{123.45678e−2}$ and $\text{12345678e−07}$ all represent the same number. It is safest to include an explicit decimal point.
Lines with an asterisk ($*$) in column $1$ will be considered comment lines and will be ignored by the function.
Columns outside the six fields must be blank, except for columns 72–80, whose contents are ignored by the function. A non-blank character outside the predefined six fields and columns 72–80 is considered to be a major error (${\mathbf{fail}}\mathbf{.}\mathbf{code}=$ NE_MPS_ILLEGAL_DATA_LINE; see Section 6), unless it is part of a comment.

#### 3.1.1  NAME Section (optional)

The NAME section is the only section where the data must be on the same line as the indicator. The ‘user-supplied name’ must be in field $3$ but may be blank.
 Field Required Description $3$ No Name of the problem

#### 3.1.2  OBJSENSE Section (optional)

The data line in this section can be used to specify the sense of the objective function. If this section is present it must contain only one data line. If the section is missing or empty, minimization is assumed.
 Field Required Description $2$ No Sense of the objective function
Field 2 may contain either MIN, MAX, MINIMIZE or MAXIMIZE.

#### 3.1.3  OBJNAME Section (optional)

The data line in this section can be used to specify the name of a free row (see Section 3.1.4) that should be used as the objective function. If this section is present it must contain only one data line. If the section is missing or is empty, the first free row will be chosen instead. Alternatively, OBJNAME can be overridden by setting nonempty ${\mathbf{pnames}}\left[1\right]$ (see Section 5).
 Field Required Description $2$ No Row name to be used as the objective function
Field 2 must contain a valid row name.

#### 3.1.4  ROWS Section

The data lines in this section specify unique row (constraint) names and their inequality types (i.e., unconstrained, $=$, $\ge$ or $\le$).
 Field Required Description $1$ Yes Inequality key $2$ Yes Row name
The inequality key specifies each row's type. It must be E, G, L or N and can be in either column $2$ or $3$.
 Inequality Key Description $\mathbit{l}$ $\mathbit{u}$ N Free row $-\infty$ $\infty$ G Greater than or equal to finite $\infty$ L Less than or equal to $-\infty$ finite E Equal to finite $l$
Row type N stands for ‘Not binding’. It can be used to define the objective row. The objective row is a free row that specifies the vector $c$ in the linear objective term ${c}^{\mathrm{T}}x$. If there is more than one free row, the first free row is chosen, unless another free row name is specified by OBJNAME (see Section 3.1.3) or ${\mathbf{pnames}}\left[1\right]$ (see Section 5). Note that $c$ is assumed to be zero if either the chosen row does not appear in the COLUMNS section (i.e., has no nonzero elements) or there are no free rows defined in the ROWS section.

#### 3.1.5  COLUMNS Section

Data lines in this section specify the names to be assigned to the variables (columns) in the general linear constraint matrix $A$, and define, in terms of column vectors, the actual values of the corresponding matrix elements.
 Field Required Description $2$ Yes Column name $3$ Yes Row name $4$ Yes Value $5$ No Row name $6$ No Value
Each data line in the COLUMNS section defines the nonzero elements of $A$ or $c$. Any elements of $A$ or $c$ that are undefined are assumed to be zero. Nonzero elements of $A$ must be grouped by column, that is to say that all of the nonzero elements in the jth column of $A$ must be specified before those in the $\mathit{j}+1$th column, for $\mathit{j}=1,2,\dots ,n-1$. Rows may appear in any order within the column.
##### 3.1.5.1  Integer Markers
For backward compatibility nag_opt_miqp_mps_read (e04mxc) allows you to define the integer variables within the COLUMNS section using integer markers, although this is not recommended as markers can be treated differently by different MPS readers; you should instead define any integer variables in the BOUNDS section (see below). Each marker line must have the following format:
 Field Required Description $2$ No Marker ID $3$ Yes Marker tag $5$ Yes Marker type
The marker tag must be ${}^{\prime }$MARKER${}^{\prime }$. The marker type must be ${}^{\prime }$INTORG${}^{\prime }$ to start reading integer variables and ${}^{\prime }$INTEND${}^{\prime }$ to finish reading integer variables. This implies that a row cannot be named ${}^{\prime }$MARKER${}^{\prime }$, ${}^{\prime }$INTORG${}^{\prime }$ or ${}^{\prime }$INTEND${}^{\prime }$. Please note that both marker tag and marker type comprise of $8$ characters as a ${}^{\prime }$ is the mandatory first and last character in the string. You may wish to have several integer marker sections within the COLUMNS section, in which case each marker section must begin with an ${}^{\prime }$INTORG${}^{\prime }$ marker and end with an ${}^{\prime }$INTEND${}^{\prime }$ marker and there should not be another marker between them.
Field 2 is ignored by nag_opt_miqp_mps_read (e04mxc). When an integer variable is declared it will keep its default bounds unless they are changed in the BOUNDS section. This may vary between different MPS readers.

#### 3.1.6  RHS Section

This section specifies the right-hand side values (if any) of the general linear constraint matrix $A$.
 Field Required Description $2$ Yes RHS name $3$ Yes Row name $4$ Yes Value $5$ No Row name $6$ No Value
The MPS file may contain several RHS sets distinguished by RHS name. If an RHS name is defined in ${\mathbf{pnames}}\left[2\right]$ (see Section 5) then nag_opt_miqp_mps_read (e04mxc) will read in only that RHS vector, otherwise the first RHS set will be used.
Only the nonzero RHS elements need to be specified. Note that if an RHS is given to the objective function it will be ignored by nag_opt_miqp_mps_read (e04mxc). An RHS given to the objective function is dealt with differently by different MPS readers, therefore it is safer to not define an RHS of the objective function in your MPS file. Note that this section may be empty, in which case the RHS vector is assumed to be zero.

#### 3.1.7  RANGES Section (optional)

Ranges are used to modify the interpretation of constraints defined in the ROWS section (see Section 3.1.4) to the form $l\le Ax\le u$, where both $l$ and $u$ are finite. The range of the constraint is $r=u-l$.
 Field Required Description $2$ Yes Range name $3$ Yes Row name $4$ Yes Value $5$ No Row name $6$ No Value
The range of each constraint implies an upper and lower bound dependent on the inequality key of each constraint, on the RHS $b$ of the constraint (as defined in the RHS section), and on the range $r$.
 Inequality Key Sign of $\text{}\mathbit{r}$ $\mathbit{l}$ $\mathbit{u}$ E $+$ $b$ $b+r$ E $-$ $b+r$ $b$ G $+/-$ $b$ $b+\left|r\right|$ L $+/-$ $b-\left|r\right|$ $b$ N $+/-$ $-\infty$ $+\infty$
If a range name is defined in ${\mathbf{pnames}}\left[3\right]$ (see Section 5) then the function will read in only the range set of that name, otherwise the first set will be used.

#### 3.1.8  BOUNDS Section (optional)

These lines specify limits on the values of the variables (the quantities $l$ and $u$ in $l\le x\le u$). If a variable is not specified in the bound set then it is automatically assumed to lie between $0$ and $+\infty$.
 Field Required Description $1$ Yes Bound type identifier $2$ Yes Bound name $3$ Yes Column name $4$ Yes/No Value
Note: field 4 is required only if the bound type identifier is one of UP, LO, FX, UI or LI in which case it gives the value $k$ below. If the bound type identifier is FR, MI, PL or BV, field 4 is ignored and it is recommended to leave it blank.
The table below describes the acceptable bound type identifiers and how each determines the variables' bounds.
 Bound TypeIdentifier $\mathbit{l}$ $\mathbit{u}$ IntegerVariable? UP unchanged $k$ No LO $k$ unchanged No FX $k$ $k$ No FR $-\infty$ $\infty$ No MI $-\infty$ unchanged No PL unchanged $\infty$ No BV $0$ $1$ Yes UI unchanged $k$ Yes LI $k$ unchanged Yes
If a bound name is defined in ${\mathbf{pnames}}\left[4\right]$ (see Section 5) then the function will read in only the bound set of that name, otherwise the first set will be used.

The QUADOBJ section defines nonzero elements of the upper or lower triangle of the Hessian matrix $H$.
 Field Required Description $2$ Yes Column name (HColumn Index) $3$ Yes Column name (HRow Index) $4$ Yes Value $5$ No Column name (HRow Index) $6$ No Value
Each data line in the QUADOBJ section defines one (or optionally two) nonzero elements ${H}_{ij}$ of the matrix $H$. Each element ${H}_{ij}$ is given as a triplet of row index $i$, column index $j$ and a value. The column names (as defined in the COLUMNS section) are used to link the names of the variables and the indices $i$ and $j$. More precisely, the matrix $H$ on output will have a nonzero element
 $Hij = Value$
where index $j$ belongs to HColumn Index and index $i$ to one of the HRow Indices such that
• ${\mathbf{crname}}\left[j-1\right]=\text{Column name (HColumn Index)}$ and
• ${\mathbf{crname}}\left[i-1\right]=\text{Column name (HRow Index)}$.
It is only necessary to define either the upper or lower triangle of the $H$ matrix; either will suffice. Any elements that have been defined in the upper triangle of the matrix will be moved to the lower triangle of the matrix, then any repeated nonzeros will be summed.
Note: it is much more efficient for nag_opt_sparse_convex_qp_solve (e04nqc) to have the $H$ matrix defined by the first ncolh column names. If the nonzeros of $H$ are defined by any columns that are not in the first ncolh of n then nag_opt_miqp_mps_read (e04mxc) will rearrange the matrices $A$ and $H$ so that they are.

### 3.2  Query Mode

nag_opt_miqp_mps_read (e04mxc) offers a ‘query mode’ to quickly give upper estimates on the sizes of user arrays. In this mode any expensive checks of the data and of the file format are skipped, providing a prompt count of the number of variables, constraints and matrix nonzeros. This might be useful in the common case where the size of the problem is not known in advance.
You may activate query mode by setting any of the following: ${\mathbf{maxn}}<1$, ${\mathbf{maxm}}<1$, ${\mathbf{maxnnz}}<1$, ${\mathbf{maxncolh}}<0$ or ${\mathbf{maxnnzh}}<0$. If no major formatting error is detected in the data file, ${\mathbf{fail}}\mathbf{.}\mathbf{code}=$ NE_NOERROR is returned and the upper estimates are given as stated in Table 1. Alternatively, the function switches to query mode while the file is being read if it is discovered that the provided space is insufficient (that is, if ${\mathbf{n}}>{\mathbf{maxn}}$, ${\mathbf{m}}>{\mathbf{maxm}}$, ${\mathbf{nnz}}>{\mathbf{maxnnz}}$, ${\mathbf{ncolh}}>{\mathbf{maxncolh}}$, ${\mathbf{nnzh}}>{\mathbf{maxnnzh}}$ or ${\mathbf{lintvar}}>{\mathbf{maxlintvar}}$). In this case ${\mathbf{fail}}\mathbf{.}\mathbf{code}=$ NE_INT_MAX is returned.
 Argument Name Upper Estimate for n maxn m maxm nnz maxnnz ncolh maxncolh nnzh maxnnzh lintvar maxlintvar
Table 1
The recommended practice is shown in Section 10, where the function is invoked twice. The first call queries the array lengths required, after which the data arrays are allocated to be of these sizes. The second call reads the data using the sufficiently-sized arrays.

## 4  References

IBM (1971) MPSX – Mathematical programming system Program Number 5734 XM4 IBM Trade Corporation, New York

## 5  Arguments

1:     fileidNag_FileIDInput
On entry: the ID of the MPSX data file to be read as returned by a call to nag_open_file (x04acc).
Constraint: ${\mathbf{fileid}}\ge 0$.
2:     maxnIntegerInput
On entry: an upper limit for the number of variables in the problem.
If ${\mathbf{maxn}}<1$, nag_opt_miqp_mps_read (e04mxc) will start in query mode (see Section 3.2).
3:     maxmIntegerInput
On entry: an upper limit for the number of general linear constraints (including the objective row) in the problem.
If ${\mathbf{maxm}}<1$, nag_opt_miqp_mps_read (e04mxc) will start in query mode (see Section 3.2).
4:     maxnnzIntegerInput
On entry: an upper limit for the number of nonzeros (including the objective row) in the problem.
If ${\mathbf{maxnnz}}<1$, nag_opt_miqp_mps_read (e04mxc) will start in query mode (see Section 3.2).
5:     maxncolhIntegerInput
On entry: an upper limit for the dimension of the matrix $H$.
If ${\mathbf{maxncolh}}<0$, nag_opt_miqp_mps_read (e04mxc) will start in query mode (see Section 3.2).
6:     maxnnzhIntegerInput
On entry: an upper limit for the number of nonzeros of the matrix $H$.
If ${\mathbf{maxnnzh}}<0$, nag_opt_miqp_mps_read (e04mxc) will start in query mode (see Section 3.2).
7:     maxlintvarIntegerInput
On entry: if ${\mathbf{maxlintvar}}\ge 0$, an upper limit for the number of integer variables.
If ${\mathbf{maxlintvar}}<0$, nag_opt_miqp_mps_read (e04mxc) will treat all integer variables in the file as continuous variables.
8:     mpslstIntegerInput
On entry: if ${\mathbf{mpslst}}\ne 0$, summary messages are sent to stdout as nag_opt_miqp_mps_read (e04mxc) reads through the data file. This can be useful for debugging the file. If ${\mathbf{mpslst}}=0$, then no summary is produced.
9:     nInteger *Output
On exit: if nag_opt_miqp_mps_read (e04mxc) was run in query mode (see Section 3.2), or returned with ${\mathbf{fail}}\mathbf{.}\mathbf{code}=$ NE_INT_MAX, an upper estimate of the number of variables of the problem. Otherwise, $n$, the actual number of variables in the problem.
10:   mInteger *Output
On exit: if nag_opt_miqp_mps_read (e04mxc) was run in query mode (see Section 3.2), or returned with ${\mathbf{fail}}\mathbf{.}\mathbf{code}=$ NE_INT_MAX, an upper estimate of the number of general linear constraints in the problem (including the objective row). Otherwise $m$, the actual number of general linear constaints of the problem.
11:   nnzInteger *Output
On exit: if nag_opt_miqp_mps_read (e04mxc) was run in query mode (see Section 3.2), or returned with ${\mathbf{fail}}\mathbf{.}\mathbf{code}=$ NE_INT_MAX, an upper estimate of the number of nonzeros in the problem (including the objective row). Otherwise the actual number of nonzeros in the problem (including the objective row).
12:   ncolhInteger *Output
On exit: if nag_opt_miqp_mps_read (e04mxc) was run in query mode (see Section 3.2), or returned with ${\mathbf{fail}}\mathbf{.}\mathbf{code}=$ NE_INT_MAX, an upper estimate of the value of ncolh required by nag_opt_sparse_convex_qp_solve (e04nqc). In this context ncolh is the number of leading nonzero columns of the Hessian matrix $H$. Otherwise, the actual dimension of the matrix $H$.
13:   nnzhInteger *Output
On exit: if nag_opt_miqp_mps_read (e04mxc) was run in query mode (see Section 3.2), or returned with ${\mathbf{fail}}\mathbf{.}\mathbf{code}=$ NE_INT_MAX, an upper estimate of the number of nonzeros of the matrix $H$. Otherwise, the actual number of nonzeros of the matrix $H$.
14:   lintvarInteger *Output
On exit: if on entry ${\mathbf{maxlintvar}}<0$, all integer variables are treated as continuous and ${\mathbf{lintvar}}=-1$.
If nag_opt_miqp_mps_read (e04mxc) was run in query mode (see Section 3.2), or returned with ${\mathbf{fail}}\mathbf{.}\mathbf{code}=$ NE_INT_MAX, an upper estimate of the number of integer variables of the problem. Otherwise, the actual number of integer variables of the problem.
15:   iobjInteger *Output
On exit: if ${\mathbf{iobj}}>0$, row iobj of $A$ is a free row containing the nonzero coefficients of the vector $c$.
If ${\mathbf{iobj}}=0$, the coefficients of $c$ are assumed to be zero.
If nag_opt_miqp_mps_read (e04mxc) is run in query mode (see Section 3.2) iobj is not referenced and may be NULL.
16:   a[$\mathit{dim}$]doubleOutput
Note: the dimension, dim, of the array a must be at least maxnnz when ${\mathbf{maxnnz}}>0$.
On exit: the nonzero elements of $A$, ordered by increasing column index.
If nag_opt_miqp_mps_read (e04mxc) is run in query mode (see Section 3.2), a is not referenced and may be NULL.
17:   irowa[$\mathit{dim}$]IntegerOutput
Note: the dimension, dim, of the array irowa must be at least maxnnz when ${\mathbf{maxnnz}}>0$.
On exit: the row indices of the nonzero elements stored in a.
If nag_opt_miqp_mps_read (e04mxc) is run in query mode (see Section 3.2), irowa is not referenced and may be NULL.
18:   iccola[$\mathit{dim}$]IntegerOutput
Note: the dimension, dim, of the array iccola must be at least ${\mathbf{maxn}}+1$ when ${\mathbf{maxn}}>0$.
On exit: a set of pointers to the beginning of each column of $A$. More precisely, ${\mathbf{iccola}}\left[\mathit{i}-1\right]$ contains the index in a of the start of the $\mathit{i}$th column, for $\mathit{i}=1,2,\dots ,{\mathbf{n}}$. Note that ${\mathbf{iccola}}\left[0\right]=1$ and ${\mathbf{iccola}}\left[{\mathbf{n}}\right]={\mathbf{nnz}}+1$.
If nag_opt_miqp_mps_read (e04mxc) is run in query mode (see Section 3.2), iccola is not referenced and may be NULL.
19:   bl[$\mathit{dim}$]doubleOutput
20:   bu[$\mathit{dim}$]doubleOutput
Note: the dimension, dim, of the arrays bl and bu must be at least ${\mathbf{maxn}}+{\mathbf{maxm}}$ when ${\mathbf{maxn}}>0$ and ${\mathbf{maxm}}>0$.
On exit: bl contains the vector $l$ (the lower bounds) and bu contains the vector $u$ (the upper bounds), for all the variables and constraints in the following order. The first n elements of each array contains the bounds on the variables $x$ and the next m elements contains the bounds for the linear objective term ${c}^{\mathrm{T}}x$ and for the general linear constraints $Ax$ (if any). Note that an ‘infinite’ lower bound is indicated by ${\mathbf{bl}}\left[j-1\right]=-\text{1.0e+20}$ and an ‘infinite’ upper bound by ${\mathbf{bu}}\left[j-1\right]=+\text{1.0e+20}$. In other words, any element of $u$ greater than or equal to ${10}^{20}$ will be regarded as $+\infty$ (and similarly any element of $l$ less than or equal to $-{10}^{20}$ will be regarded as $-\infty$). If this value is deemed to be ‘inappropriate’, before calling nag_opt_sparse_convex_qp_solve (e04nqc) you are recommended to reset the value of its optional argument ${\mathbf{Infinite Bound Size}}$ and make any necessary changes to bl and/or bu.
If nag_opt_miqp_mps_read (e04mxc) is run in query mode (see Section 3.2), bl and bu are not referenced and may be NULL.
21:   pnames[$5$][$9$]char Input/Output
On entry: a set of names associated with the MPSX form of the problem.
${\mathbf{pnames}}\left[0\right]$
Must either contain the name of the problem or be blank.
${\mathbf{pnames}}\left[1\right]$
Must either be blank or contain the name of the objective row (in which case it overrides the OBJNAME section and the default choice of the first objective free row).
${\mathbf{pnames}}\left[2\right]$
Must either contain the name of the RHS set to be used or be blank (in which case the first RHS set is used).
${\mathbf{pnames}}\left[3\right]$
Must either contain the name of the RANGE set to be used or be blank (in which case the first RANGE set (if any) is used).
${\mathbf{pnames}}\left[4\right]$
Must either contain the name of the BOUNDS set to be used or be blank (in which case the first BOUNDS set (if any) is used).
On exit: a set of names associated with the problem as defined in the MPSX data file as follows:
${\mathbf{pnames}}\left[0\right]$
Contains the name of the problem (or blank if none).
${\mathbf{pnames}}\left[1\right]$
Contains the name of the objective row (or blank if none).
${\mathbf{pnames}}\left[2\right]$
Contains the name of the RHS set (or blank if none).
${\mathbf{pnames}}\left[3\right]$
Contains the name of the RANGE set (or blank if none).
${\mathbf{pnames}}\left[4\right]$
Contains the name of the BOUNDS set (or blank if none).
If nag_opt_miqp_mps_read (e04mxc) is run in query mode (see Section 3.2), pnames is not referenced and may be NULL.
22:   nnameInteger *Output
On exit: $n+m$, the total number of variables and constraints in the problem (including the objective row).
If nag_opt_miqp_mps_read (e04mxc) was run in query mode (see Section 3.2), or returned with ${\mathbf{fail}}\mathbf{.}\mathbf{code}=$ NE_INT_MAX, nname is not set. In the former case you may pass NULL instead.
23:   crname[$\mathit{dim}$]char Output
Note: the dimension, dim, of the array crname must be at least ${\mathbf{maxn}}+{\mathbf{maxm}}$ when ${\mathbf{maxn}}>0$ and ${\mathbf{maxm}}>0$.
On exit: the MPS names of all the variables and constraints in the problem in the following order. The first n elements contain the MPS names for the variables and the next m elements contain the MPS names for the objective row and general linear constraints (if any). Note that the MPS name for the objective row is stored in ${\mathbf{crname}}\left[{\mathbf{n}}+{\mathbf{iobj}}-1\right]$.
If nag_opt_miqp_mps_read (e04mxc) is run in query mode (see Section 3.2), crname is not referenced and may be NULL.
24:   h[$\mathit{dim}$]doubleOutput
Note: the dimension, dim, of the array h must be at least maxnnzh when ${\mathbf{maxnnzh}}>0$.
On exit: the nnzh nonzero elements of $H$, arranged by increasing column index.
If nag_opt_miqp_mps_read (e04mxc) is run in query mode (see Section 3.2), h is not referenced and may be NULL.
25:   irowh[$\mathit{dim}$]IntegerOutput
Note: the dimension, dim, of the array irowh must be at least maxnnzh when ${\mathbf{maxnnzh}}>0$.
On exit: the nnzh row indices of the elements stored in $H$.
If nag_opt_miqp_mps_read (e04mxc) is run in query mode (see Section 3.2), irowh is not referenced and may be NULL.
26:   iccolh[$\mathit{dim}$]IntegerOutput
Note: the dimension, dim, of the array iccolh must be at least ${\mathbf{maxncolh}}+1$ when ${\mathbf{maxncolh}}>0$.
On exit: a set of pointers to the beginning of each column of $H$. More precisely, ${\mathbf{iccolh}}\left[\mathit{i}-1\right]$ contains the index in $H$ of the start of the $\mathit{i}$th column, for $\mathit{i}=1,2,\dots ,{\mathbf{ncolh}}$. Note that ${\mathbf{iccolh}}\left[0\right]=1$ and ${\mathbf{iccolh}}\left[{\mathbf{ncolh}}\right]={\mathbf{nnzh}}+1$.
If nag_opt_miqp_mps_read (e04mxc) is run in query mode (see Section 3.2), iccolh is not referenced and may be NULL.
27:   minmaxInteger *Output
On exit: minmax defines the direction of the optimization as read from the MPS file. By default the function assumes the objective function should be minimized and will return ${\mathbf{minmax}}=-1$. If the function discovers in the OBJSENSE section that the objective function should be maximized it will return ${\mathbf{minmax}}=1$. If the function discovers that there is neither the linear objective term $c$ (the objective row) nor the Hessian matrix $H$, the problem is considered as a feasible point problem and ${\mathbf{minmax}}=0$ is returned.
If nag_opt_miqp_mps_read (e04mxc) was run in query mode (see Section 3.2), or returned with ${\mathbf{fail}}\mathbf{.}\mathbf{code}=$ NE_INT_MAX, minmax is not set. In the former case you may pass NULL instead.
28:   intvar[$\mathit{dim}$]IntegerOutput
Note: the dimension, dim, of the array intvar must be at least maxlintvar, when ${\mathbf{maxlintvar}}>0$.
On exit: if ${\mathbf{maxlintvar}}>0$ on entry, intvar contains pointers to the columns that are defined as integer variables. More precisely, ${\mathbf{intvar}}\left[\mathit{i}-1\right]=k$, where $k$ is the index of a column that is defined as an integer variable, for $\mathit{i}=1,2,\dots ,{\mathbf{lintvar}}$.
If ${\mathbf{maxlintvar}}\le 0$ on entry, or nag_opt_miqp_mps_read (e04mxc) was run in query mode (see Section 3.2), or it returned with ${\mathbf{fail}}\mathbf{.}\mathbf{code}=$ NE_INT_MAX, intvar is not set. Excepting the latter case you may pass NULL as this argument instead.
29:   failNagError *Input/Output
The NAG error argument (see Section 3.6 in the Essential Introduction).
Note that if any of the relevant arguments are accidentally set to zero, or not set and assume zero values, then the function will have executed in query mode. In this case only the size of the problem is returned and other arguments are not set. See Section 3.2.

## 6  Error Indicators and Warnings

NE_ALLOC_FAIL
Dynamic memory allocation failed.
On entry, argument $⟨\mathit{\text{value}}⟩$ had an illegal value.
NE_FILEID
On entry, ${\mathbf{fileid}}=⟨\mathit{\text{value}}⟩$.
Constraint: ${\mathbf{fileid}}\ge 0$.
NE_INT_MAX
At least one of maxm, maxn, maxnnz, maxnnzh, maxncolh or maxlintvar is too small. Suggested values are returned in m, n, nnz, nnzh, ncolh and lintvar respectively.
NE_INTERNAL_ERROR
An internal error has occurred in this function. Check the function call and any array sizes. If the call is correct then please contact NAG for assistance.
NE_MPS_BOUNDS
The supplied name, in ${\mathbf{pnames}}\left[4\right]$, of the BOUNDS set to be used was not found in the BOUNDS section.
Unknown bound type ‘$⟨\mathit{\text{value}}⟩$’ in BOUNDS section.
NE_MPS_COLUMNS
Column ‘$⟨\mathit{\text{value}}⟩$’ has been defined more than once in the COLUMNS section. Column definitions must be continuous. (See Section 3.1.5).
Unknown column name ‘$⟨\mathit{\text{value}}⟩$’ in $⟨\mathit{\text{value}}⟩$ section.
All column names must be specified in the COLUMNS section.
NE_MPS_ENDATA_NOT_FOUND
End of file found before ENDATA indicator line.
NE_MPS_FORMAT
Warning: MPS file not strictly fixed format, although the problem was read anyway. The data may have been read incorrectly. You should set ${\mathbf{mpslst}}=1$ and repeat the call to nag_opt_miqp_mps_read (e04mxc) for more details.
NE_MPS_ILLEGAL_DATA_LINE
An illegal line was detected in ‘$⟨\mathit{\text{value}}⟩$’ section.
This is neither a comment nor a valid data line.
NE_MPS_ILLEGAL_NUMBER
Field $⟨\mathit{\text{value}}⟩$ did not contain a number (see Section 3).
NE_MPS_INDICATOR
Incorrect ordering of indicator lines.
BOUNDS indicator line found before COLUMNS indicator line.
Incorrect ordering of indicator lines.
COLUMNS indicator line found before ROWS indicator line.
Incorrect ordering of indicator lines.
OBJNAME indicator line found after ROWS indicator line.
Incorrect ordering of indicator lines.
QUADOBJ indicator line found before BOUNDS indicator line.
Incorrect ordering of indicator lines.
QUADOBJ indicator line found before COLUMNS indicator line.
Incorrect ordering of indicator lines.
RANGES indicator line found before RHS indicator line.
Incorrect ordering of indicator lines.
RHS indicator line found before COLUMNS indicator line.
Indicator line ‘$⟨\mathit{\text{value}}⟩$’ has been found more than once in the MPS file.
No indicator line found in file. It may be an empty file.
Unknown indicator line ‘$⟨\mathit{\text{value}}⟩$’.
NE_MPS_INVALID_INTORG_INTEND
Found ‘INTEND’ marker without previous marker being ‘INTORG’.
Found ‘INTORG’ but not ‘INTEND’ before the end of the COLUMNS section.
Found ‘INTORG’ marker within ‘INTORG’ to ‘INTEND’ range.
Illegal marker type ‘$⟨\mathit{\text{value}}⟩$’.
Should be either ‘INTORG’ or ‘INTEND’.
NE_MPS_MANDATORY
NE_MPS_OBJNAME
The supplied name, in ${\mathbf{pnames}}\left[1\right]$ or in OBJNAME, of the objective row was not found among the free rows in the ROWS section.
NE_MPS_PRINTABLE
Illegal column name.
Column names must consist of printable characters only.
Illegal row name.
Row names must consist of printable characters only.
NE_MPS_RANGES
The supplied name, in ${\mathbf{pnames}}\left[3\right]$, of the RANGES set to be used was not found in the RANGES section.
NE_MPS_REPEAT_COLUMN
More than one nonzero of a has row name ‘$⟨\mathit{\text{value}}⟩$’ and column name ‘$⟨\mathit{\text{value}}⟩$’ in the COLUMNS section.
NE_MPS_REPEAT_ROW
Row name ‘$⟨\mathit{\text{value}}⟩$’ has been defined more than once in the ROWS section.
NE_MPS_RHS
The supplied name, in ${\mathbf{pnames}}\left[2\right]$, of the RHS set to be used was not found in the RHS section.
NE_MPS_ROWS
Unknown inequality key ‘$⟨\mathit{\text{value}}⟩$’ in ROWS section.
Expected ‘N’, ‘G’, ‘L’ or ‘E’.
Unknown row name ‘$⟨\mathit{\text{value}}⟩$’ in $⟨\mathit{\text{value}}⟩$ section.
All row names must be specified in the ROWS section.
NE_MPS_ROWS_OR_CONS
Empty ROWS section.
Neither the objective row nor the constraints were defined.

Not applicable.

## 8  Parallelism and Performance

nag_opt_miqp_mps_read (e04mxc) makes calls to BLAS and/or LAPACK routines, which may be threaded within the vendor library used by this implementation. Consult the documentation for the vendor library for further information.

None.

## 10  Example

This example solves the quadratic programming problem
 $minimize cT x + 12 xT H x subject to l ≤Ax ≤u, -2 ≤Ax ≤2,$
where
 $c= -4.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -0.1 -0.3 , H= 2 1 1 1 1 0 0 0 0 1 2 1 1 1 0 0 0 0 1 1 2 1 1 0 0 0 0 1 1 1 2 1 0 0 0 0 1 1 1 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ,$
 $A= 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 4.0 1.0 2.0 3.0 4.0 -2.0 1.0 1.0 1.0 1.0 1.0 -1.0 1.0 -1.0 1.0 1.0 1.0 1.0 1.0 ,$
 $l= -2.0 -2.0 -2.0 and u= 1.5 1.5 4.0 .$
The optimal solution (to five figures) is
 $x*=2.0,-0.23333,-0.26667,-0.3,-0.1,2.0,2.0,-1.7777,-0.45555T.$
Three bound constraints and two general linear constraints are active at the solution. Note that, although the Hessian matrix is only positive semidefinite, the point ${x}^{*}$ is unique.
The MPS representation of the problem is given in Section 10.2.

### 10.1  Program Text

Program Text (e04mxce.c)

### 10.2  Program Data

Program Options (e04mxce.opt)

### 10.3  Program Results

Program Results (e04mxce.r)