
alpar@1: %* glpk09.tex *%
alpar@1: 
alpar@1: \chapter{CPLEX LP Format}
alpar@1: \label{chacplex}
alpar@1: 
alpar@1: \section{Prelude}
alpar@1: 
alpar@1: The CPLEX LP format\footnote{The CPLEX LP format was developed in
alpar@1: the end of 1980's by CPLEX Optimization, Inc. as an input format for
alpar@1: the CPLEX linear programming system. Although the CPLEX LP format is
alpar@1: not as widely used as the MPS format, being row-oriented it is more
alpar@1: convenient for coding mathematical programming models by human. This
alpar@1: appendix describes only the features of the CPLEX LP format which are
alpar@1: implemented in the GLPK package.} is intended for coding LP/MIP problem
alpar@1: data. It is a row-oriented format that assumes the formulation of LP/MIP
alpar@1: problem (1.1)---(1.3) (see Section \ref{seclp}, page \pageref{seclp}).
alpar@1: 
alpar@1: CPLEX LP file is a plain text file written in CPLEX LP format. Each text
alpar@1: line of this file may contain up to 255 characters\footnote{GLPK allows
alpar@1: text lines of arbitrary length.}. Blank lines are ignored. If a line
alpar@1: contains the backslash character ($\backslash$), this character and
alpar@1: everything that follows it until the end of line are considered as a
alpar@1: comment and also ignored.
alpar@1: 
alpar@1: An LP file is coded by the user using the following elements:
alpar@1: 
alpar@1: $\bullet$ keywords;
alpar@1: 
alpar@1: $\bullet$ symbolic names;
alpar@1: 
alpar@1: $\bullet$ numeric constants;
alpar@1: 
alpar@1: $\bullet$ delimiters;
alpar@1: 
alpar@1: $\bullet$ blanks.
alpar@1: 
alpar@1: \newpage
alpar@1: 
alpar@1: {\it Keywords} which may be used in the LP file are the following:
alpar@1: 
alpar@1: \begin{verbatim}
alpar@1:       minimize        minimum        min
alpar@1:       maximize        maximum        max
alpar@1:       subject to      such that      s.t.      st.      st
alpar@1:       bounds          bound
alpar@1:       general         generals       gen
alpar@1:       integer         integers       int
alpar@1:       binary          binaries       bin
alpar@1:       infinity        inf
alpar@1:       free
alpar@1:       end
alpar@1: \end{verbatim}
alpar@1: 
alpar@1: \noindent
alpar@1: All the keywords are case insensitive. Keywords given above on the same
alpar@1: line are equivalent. Any keyword (except \verb|infinity|, \verb|inf|,
alpar@1: and \verb|free|) being used in the LP file must start at the beginning
alpar@1: of a text line.
alpar@1: 
alpar@1: {\it Symbolic names} are used to identify the objective function,
alpar@1: constraints (rows), and variables (columns). All symbolic names are case
alpar@1: sensitive and may contain up to 16 alphanumeric characters\footnote{GLPK
alpar@1: allows symbolic names having up to 255 characters.} (\verb|a|, \dots,
alpar@1: \verb|z|, \verb|A|, \dots, \verb|Z|, \verb|0|, \dots, \verb|9|) as well
alpar@1: as the following characters:
alpar@1: 
alpar@1: \begin{verbatim}
alpar@1: !  "  #  $  %  &  (  )  /  ,  .  ;  ?  @  _  `  '  {  }  |  ~
alpar@1: \end{verbatim}
alpar@1: 
alpar@1: \noindent
alpar@1: with exception that no symbolic name can begin with a digit or a period.
alpar@1: 
alpar@1: {\it Numeric constants} are used to denote constraint and objective
alpar@1: coefficients, right-hand sides of constraints, and bounds of variables.
alpar@1: They are coded in the standard form $xx$\verb|E|$syy$, where $xx$ is
alpar@1: a real number with optional decimal point, $s$ is a sign (\verb|+| or
alpar@1: \verb|-|), $yy$ is an integer decimal exponent. Numeric constants may
alpar@1: contain arbitrary number of characters. The exponent part is optional.
alpar@1: The letter `\verb|E|' can be coded as `\verb|e|'. If the sign $s$ is
alpar@1: omitted, plus is assumed.
alpar@1: 
alpar@1: {\it Delimiters} that may be used in the LP file are the following:
alpar@1: 
alpar@1: \begin{verbatim}
alpar@1:       :
alpar@1:       +
alpar@1:       -
alpar@1:       <   <=   =<
alpar@1:       >   >=   =>
alpar@1:       =
alpar@1: \end{verbatim}
alpar@1: 
alpar@1: \noindent
alpar@1: Delimiters given above on the same line are equivalent. The meaning of
alpar@1: the delimiters will be explained below.
alpar@1: 
alpar@1: {\it Blanks} are non-significant characters. They may be used freely to
alpar@1: improve readability of the LP file. Besides, blanks should be used to
alpar@1: separate elements from each other if there is no other way to do that
alpar@1: (for example, to separate a keyword from a following symbolic name).
alpar@1: 
alpar@1: The order of an LP file is:
alpar@1: 
alpar@1: $\bullet$ objective function definition;
alpar@1: 
alpar@1: $\bullet$ constraints section;
alpar@1: 
alpar@1: $\bullet$ bounds section;
alpar@1: 
alpar@1: $\bullet$ general, integer, and binary sections (can appear in arbitrary
alpar@1: order);
alpar@1: 
alpar@1: $\bullet$ end keyword.
alpar@1: 
alpar@1: These components are discussed in following sections.
alpar@1: 
alpar@1: \section{Objective function definition}
alpar@1: 
alpar@1: The objective function definition must appear first in the LP file. It
alpar@1: defines the objective function and specifies the optimization direction.
alpar@1: 
alpar@1: The objective function definition has the following form:
alpar@1: $$
alpar@1: \left\{
alpar@1: \begin{array}{@{}c@{}}
alpar@1: {\tt minimize} \\ {\tt maximize}
alpar@1: \end{array}
alpar@1: \right\}\ f\ {\tt :}\ s\ c\ x\ s\ c\ x\ \dots\ s\ c\ x
alpar@1: $$
alpar@1: where $f$ is a symbolic name of the objective function, $s$ is a sign
alpar@1: \verb|+| or \verb|-|, $c$ is a numeric constant that denotes an
alpar@1: objective coefficient, $x$ is a symbolic name of a variable.
alpar@1: 
alpar@1: If necessary, the objective function definition can be continued on as
alpar@1: many text lines as desired.
alpar@1: 
alpar@1: The name of the objective function is optional and may be omitted
alpar@1: (together with the semicolon that follows it). In this case the default
alpar@1: name `\verb|obj|' is assigned to the objective function.
alpar@1: 
alpar@1: If the very first sign $s$ is omitted, the sign plus is assumed. Other
alpar@1: signs cannot be omitted.
alpar@1: 
alpar@1: If some objective coefficient $c$ is omitted, 1 is assumed.
alpar@1: 
alpar@1: Symbolic names $x$ used to denote variables are recognized by context
alpar@1: and therefore needn't to be declared somewhere else.
alpar@1: 
alpar@1: Here is an example of the objective function definition:
alpar@1: 
alpar@1: \begin{verbatim}
alpar@1:    Minimize Z : - x1 + 2 x2 - 3.5 x3 + 4.997e3x(4) + x5 + x6 +
alpar@1:       x7 - .01x8
alpar@1: \end{verbatim}
alpar@1: 
alpar@1: \section{Constraints section}
alpar@1: 
alpar@1: The constraints section must follow the objective function definition.
alpar@1: It defines a system of equality and/or inequality constraints.
alpar@1: 
alpar@1: The constraint section has the following form:
alpar@1: 
alpar@1: \begin{center}
alpar@1: \begin{tabular}{l}
alpar@1: \verb|subject to| \\
alpar@1: {\it constraint}$_1$ \\
alpar@1: {\it constraint}$_2$ \\
alpar@1: \hspace{20pt}\dots \\
alpar@1: {\it constraint}$_m$ \\
alpar@1: \end{tabular}
alpar@1: \end{center}
alpar@1: 
alpar@1: \noindent where {\it constraint}$_i, i=1,\dots,m,$ is a particular
alpar@1: constraint definition.
alpar@1: 
alpar@1: Each constraint definition can be continued on as many text lines as
alpar@1: desired. However, each constraint definition must begin on a new line
alpar@1: except the very first constraint definition which can begin on the same
alpar@1: line as the keyword `\verb|subject to|'.
alpar@1: 
alpar@1: Constraint definitions have the following form:
alpar@1: $$
alpar@1: r\ {\tt:}\ s\ c\ x\ s\ c\ x\ \dots\ s\ c\ x
alpar@1: \ \left\{
alpar@1: \begin{array}{@{}c@{}}
alpar@1: \mbox{\tt<=} \\ \mbox{\tt>=} \\ \mbox{\tt=}
alpar@1: \end{array}
alpar@1: \right\}\ b
alpar@1: $$
alpar@1: where $r$ is a symbolic name of a constraint, $s$ is a sign \verb|+| or
alpar@1: \verb|-|, $c$ is a numeric constant that denotes a constraint
alpar@1: coefficient, $x$ is a symbolic name of a variable, $b$ is a right-hand
alpar@1: side.
alpar@1: 
alpar@1: The name $r$ of a constraint (which is the name of the corresponding
alpar@1: auxiliary variable) is optional and may be omitted (together with the
alpar@1: semicolon that follows it). In this case the default names like
alpar@1: `\verb|r.nnn|' are assigned to unnamed constraints.
alpar@1: 
alpar@1: The linear form $s\ c\ x\ s\ c\ x\ \dots\ s\ c\ x$ in the left-hand
alpar@1: side of a constraint definition has exactly the same meaning as in the
alpar@1: case of the objective function definition (see above).
alpar@1: 
alpar@1: After the linear form one of the following delimiters that indicate
alpar@1: the constraint sense must be specified:
alpar@1: 
alpar@1: \verb|<=| \ means `less than or equal to'
alpar@1: 
alpar@1: \verb|>=| \ means `greater than or equal to'
alpar@1: 
alpar@1: \verb|= | \ means `equal to'
alpar@1: 
alpar@1: The right hand side $b$ is a numeric constant with an optional sign.
alpar@1: 
alpar@1: Here is an example of the constraints section:
alpar@1: 
alpar@1: \begin{verbatim}
alpar@1:    Subject To
alpar@1:       one: y1 + 3 a1 - a2 - b >= 1.5
alpar@1:       y2 + 2 a3 + 2
alpar@1:          a4 - b >= -1.5
alpar@1:       two : y4 + 3 a1 + 4 a5 - b <= +1
alpar@1:       .20y5 + 5 a2 - b = 0
alpar@1:       1.7 y6 - a6 + 5 a777 - b >= 1
alpar@1: \end{verbatim}
alpar@1: 
alpar@1: (Should note that it is impossible to express ranged constraints in the
alpar@1: CPLEX LP format. Each a ranged constraint can be coded as two
alpar@1: constraints with identical linear forms in the left-hand side, one of
alpar@1: which specifies a lower bound and other does an upper one of the
alpar@1: original ranged constraint.)
alpar@1: 
alpar@1: \section{Bounds section}
alpar@1: 
alpar@1: The bounds section is intended to define bounds of variables. This
alpar@1: section is optional; if it is specified, it must follow the constraints
alpar@1: section. If the bound section is omitted, all variables are assumed to
alpar@1: be non-negative (i.e. that they have zero lower bound and no upper
alpar@1: bound).
alpar@1: 
alpar@1: The bounds section has the following form:
alpar@1: 
alpar@1: \begin{center}
alpar@1: \begin{tabular}{l}
alpar@1: \verb|bounds| \\
alpar@1: {\it definition}$_1$ \\
alpar@1: {\it definition}$_2$ \\
alpar@1: \hspace{20pt}\dots \\
alpar@1: {\it definition}$_p$ \\
alpar@1: \end{tabular}
alpar@1: \end{center}
alpar@1: 
alpar@1: \noindent
alpar@1: where {\it definition}$_k, k=1,\dots,p,$ is a particular bound
alpar@1: definition.
alpar@1: 
alpar@1: Each bound definition must begin on a new line\footnote{The GLPK
alpar@1: implementation allows several bound definitions to be placed on the same
alpar@1: line.} except the very first bound definition which can begin on the
alpar@1: same line as the keyword `\verb|bounds|'.
alpar@1: 
alpar@1: Syntactically constraint definitions can have one of the following six
alpar@1: forms:
alpar@1: 
alpar@1: \begin{center}
alpar@1: \begin{tabular}{ll}
alpar@1: $x$ \verb|>=| $l$ &              specifies a lower bound \\
alpar@1: $l$ \verb|<=| $x$ &              specifies a lower bound \\
alpar@1: $x$ \verb|<=| $u$ &              specifies an upper bound \\
alpar@1: $l$ \verb|<=| $x$ \verb|<=| $u$ &specifies both lower and upper bounds\\
alpar@1: $x$ \verb|=| $t$                &specifies a fixed value \\
alpar@1: $x$ \verb|free|                 &specifies free variable
alpar@1: \end{tabular}
alpar@1: \end{center}
alpar@1: 
alpar@1: \noindent
alpar@1: where $x$ is a symbolic name of a variable, $l$ is a numeric constant
alpar@1: with an optional sign that defines a lower bound of the variable or
alpar@1: \verb|-inf| that means that the variable has no lower bound, $u$ is a
alpar@1: numeric constant with an optional sign that defines an upper bound of
alpar@1: the variable or \verb|+inf| that means that the variable has no upper
alpar@1: bound, $t$ is a numeric constant with an optional sign that defines a
alpar@1: fixed value of the variable.
alpar@1: 
alpar@1: By default all variables are non-negative, i.e. have zero lower bound
alpar@1: and no upper bound. Therefore definitions of these default bounds can be
alpar@1: omitted in the bounds section.
alpar@1: 
alpar@1: Here is an example of the bounds section:
alpar@1: 
alpar@1: \begin{verbatim}
alpar@1:    Bounds
alpar@1:       -inf <= a1 <= 100
alpar@1:       -100 <= a2
alpar@1:       b <= 100
alpar@1:       x2 = +123.456
alpar@1:       x3 free
alpar@1: \end{verbatim}
alpar@1: 
alpar@1: \section{General, integer, and binary sections}
alpar@1: 
alpar@1: The general, integer, and binary sections are intended to define
alpar@1: some variables as integer or binary. All these sections are optional
alpar@1: and needed only in case of MIP problems. If they are specified, they
alpar@1: must follow the bounds section or, if the latter is omitted, the
alpar@1: constraints section.
alpar@1: 
alpar@1: All the general, integer, and binary sections have the same form as
alpar@1: follows:
alpar@1: 
alpar@1: \begin{center}
alpar@1: \begin{tabular}{l}
alpar@1: $
alpar@1: \left\{
alpar@1: \begin{array}{@{}l@{}}
alpar@1: \verb|general| \\
alpar@1: \verb|integer| \\
alpar@1: \verb|binary | \\
alpar@1: \end{array}
alpar@1: \right\}
alpar@1: $ \\
alpar@1: \hspace{10pt}$x_1$ \\
alpar@1: \hspace{10pt}$x_2$ \\
alpar@1: \hspace{10pt}\dots \\
alpar@1: \hspace{10pt}$x_q$ \\
alpar@1: \end{tabular}
alpar@1: \end{center}
alpar@1: 
alpar@1: \noindent
alpar@1: where $x_k$ is a symbolic name of variable, $k=1,\dots,q$.
alpar@1: 
alpar@1: Each symbolic name must begin on a new line\footnote{The GLPK
alpar@1: implementation allows several symbolic names to be placed on the same
alpar@1: line.} except the very first symbolic name which can begin on the same
alpar@1: line as the keyword `\verb|general|', `\verb|integer|', or
alpar@1: `\verb|binary|'.
alpar@1: 
alpar@1: If a variable appears in the general or the integer section, it is
alpar@1: assumed to be general integer variable. If a variable appears in the
alpar@1: binary section, it is assumed to be binary variable, i.e. an integer
alpar@1: variable whose lower bound is zero and upper bound is one. (Note that
alpar@1: if bounds of a variable are specified in the bounds section and then
alpar@1: the variable appears in the binary section, its previously specified
alpar@1: bounds are ignored.)
alpar@1: 
alpar@1: Here is an example of the integer section:
alpar@1: 
alpar@1: \begin{verbatim}
alpar@1:    Integer
alpar@1:       z12
alpar@1:       z22
alpar@1:       z35
alpar@1: \end{verbatim}
alpar@1: 
alpar@1: \section{End keyword}
alpar@1: 
alpar@1: The keyword `\verb|end|' is intended to end the LP file. It must begin
alpar@1: on a separate line and no other elements (except comments and blank
alpar@1: lines) must follow it. Although this keyword is optional, it is strongly
alpar@1: recommended to include it in the LP file.
alpar@1: 
alpar@1: \section{Example of CPLEX LP file}
alpar@1: 
alpar@1: Here is a complete example of CPLEX LP file that corresponds to the
alpar@1: example given in Section \ref{secmpsex}, page \pageref{secmpsex}.
alpar@1: 
alpar@1: {\footnotesize
alpar@1: \begin{verbatim}
alpar@1: \* plan.lp *\
alpar@1: 
alpar@1: Minimize
alpar@1:    value: .03 bin1 + .08 bin2 + .17 bin3 + .12 bin4 + .15 bin5 +
alpar@1:           .21 alum + .38 silicon
alpar@1: 
alpar@1: Subject To
alpar@1:    yield:     bin1 +     bin2 +     bin3 +     bin4 +     bin5 +
alpar@1:               alum +     silicon                                 =  2000
alpar@1: 
alpar@1:    fe:    .15 bin1 + .04 bin2 + .02 bin3 + .04 bin4 + .02 bin5 +
alpar@1:           .01 alum + .03 silicon                                 <=   60
alpar@1: 
alpar@1:    cu:    .03 bin1 + .05 bin2 + .08 bin3 + .02 bin4 + .06 bin5 +
alpar@1:           .01 alum                                               <=  100
alpar@1: 
alpar@1:    mn:    .02 bin1 + .04 bin2 + .01 bin3 + .02 bin4 + .02 bin5   <=   40
alpar@1: 
alpar@1:    mg:    .02 bin1 + .03 bin2                       + .01 bin5   <=   30
alpar@1: 
alpar@1:    al:    .70 bin1 + .75 bin2 + .80 bin3 + .75 bin4 + .80 bin5 +
alpar@1:           .97 alum                                               >= 1500
alpar@1: 
alpar@1:    si1:   .02 bin1 + .06 bin2 + .08 bin3 + .12 bin4 + .02 bin5 +
alpar@1:           .01 alum + .97 silicon                                 >=  250
alpar@1: 
alpar@1:    si2:   .02 bin1 + .06 bin2 + .08 bin3 + .12 bin4 + .02 bin5 +
alpar@1:           .01 alum + .97 silicon                                 <=  300
alpar@1: 
alpar@1: Bounds
alpar@1:           bin1 <=  200
alpar@1:           bin2 <= 2500
alpar@1:    400 <= bin3 <=  800
alpar@1:    100 <= bin4 <=  700
alpar@1:           bin5 <= 1500
alpar@1: 
alpar@1: End
alpar@1: 
alpar@1: \* eof *\
alpar@1: \end{verbatim}
alpar@1: 
alpar@1: }
alpar@1: 
alpar@1: %* eof *%




