doc/gmpl.tex
author Alpar Juttner <alpar@cs.elte.hu>
Mon, 06 Dec 2010 13:09:21 +0100
changeset 1 c445c931472f
permissions -rw-r--r--
Import glpk-4.45

- Generated files and doc/notes are removed
     1 %* gmpl.tex *%
     2 
     3 %***********************************************************************
     4 %  This code is part of GLPK (GNU Linear Programming Kit).
     5 %
     6 %  Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
     7 %  2009, 2010 Andrew Makhorin, Department for Applied Informatics,
     8 %  Moscow Aviation Institute, Moscow, Russia. All rights reserved.
     9 %  E-mail: <mao@gnu.org>.
    10 %
    11 %  GLPK is free software: you can redistribute it and/or modify it
    12 %  under the terms of the GNU General Public License as published by
    13 %  the Free Software Foundation, either version 3 of the License, or
    14 %  (at your option) any later version.
    15 %
    16 %  GLPK is distributed in the hope that it will be useful, but WITHOUT
    17 %  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
    18 %  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
    19 %  License for more details.
    20 %
    21 %  You should have received a copy of the GNU General Public License
    22 %  along with GLPK. If not, see <http://www.gnu.org/licenses/>.
    23 %***********************************************************************
    24 
    25 \documentclass[10pt]{article}
    26 \usepackage[dvipdfm,linktocpage,colorlinks,linkcolor=blue]{hyperref}
    27 
    28 \begin{document}
    29 
    30 \thispagestyle{empty}
    31 
    32 \begin{center}
    33 
    34 \vspace*{1in}
    35 
    36 \begin{huge}
    37 \sf\bfseries Modeling Language GNU MathProg
    38 \end{huge}
    39 
    40 \vspace{0.5in}
    41 
    42 \begin{LARGE}
    43 \sf Language Reference
    44 \end{LARGE}
    45 
    46 \vspace{0.5in}
    47 
    48 \begin{LARGE}
    49 \sf for GLPK Version 4.45
    50 \end{LARGE}
    51 
    52 \vspace{0.5in}
    53 \begin{Large}
    54 \sf (DRAFT, December 2010)
    55 \end{Large}
    56 
    57 \end{center}
    58 
    59 \newpage
    60 
    61 \vspace*{1in}
    62 
    63 \vfill
    64 
    65 \noindent
    66 The GLPK package is part of the GNU Project released under the aegis of
    67 GNU.
    68 
    69 \medskip\noindent
    70 Copyright \copyright{} 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
    71 2008, 2009, 2010 Andrew Makhorin, Department for Applied Informatics,
    72 Moscow Aviation Institute, Moscow, Russia. All rights reserved.
    73 
    74 \medskip\noindent
    75 Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
    76 MA 02110-1301, USA.
    77 
    78 \medskip\noindent
    79 Permission is granted to make and distribute verbatim copies of this
    80 manual provided the copyright notice and this permission notice are
    81 preserved on all copies.
    82 
    83 \medskip\noindent
    84 Permission is granted to copy and distribute modified versions of this
    85 manual under the conditions for verbatim copying, provided also that
    86 the entire resulting derived work is distributed under the terms of
    87 a permission notice identical to this one.
    88 
    89 \medskip\noindent
    90 Permission is granted to copy and distribute translations of this
    91 manual into another language, under the above conditions for modified
    92 versions.
    93 
    94 \newpage
    95 
    96 \tableofcontents
    97 
    98 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    99 
   100 \newpage
   101 
   102 \section{Introduction}
   103 
   104 {\it GNU MathProg} is a modeling language intended for describing
   105 linear mathematical programming models.\footnote{The GNU MathProg
   106 language is a subset of the AMPL language. Its GLPK implementation is
   107 mainly based on the paper: {\it Robert Fourer}, {\it David M. Gay}, and
   108 {\it Brian W. Kernighan}, ``A Modeling Language for Mathematical
   109 Programming.'' {\it Management Science} 36 (1990)\linebreak pp. 519-54.}
   110 
   111 Model descriptions written in the GNU MathProg language consist of
   112 a set of statements and data blocks constructed by the user from the
   113 language elements described in this document.
   114 
   115 In a process called {\it translation}, a program called the {\it model
   116 translator} analyzes the model description and translates it into
   117 internal data structures, which may be then used either for generating
   118 mathematical programming problem instance or directly by a program
   119 called the {\it solver} to obtain numeric solution of the problem.
   120 
   121 \subsection{Linear programming problem}
   122 \label{problem}
   123 
   124 In MathProg the linear programming (LP) problem is stated as follows:
   125 
   126 \medskip
   127 
   128 \noindent\hspace{.7in}minimize (or maximize)
   129 $$z=c_1x_1+c_2x_2+\dots+c_nx_n+c_0\eqno(1.1)$$
   130 \noindent\hspace{.7in}subject to linear constraints
   131 $$
   132 \begin{array}{l@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }l}
   133 L_1&\leq&a_{11}x_1&+&a_{12}x_2&+\dots+&a_{1n}x_n&\leq&U_1\\
   134 L_2&\leq&a_{21}x_1&+&a_{22}x_2&+\dots+&a_{2n}x_n&\leq&U_2\\
   135 \multicolumn{9}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}\\
   136 L_m&\leq&a_{m1}x_1&+&a_{m2}x_2&+\dots+&a_{mn}x_n&\leq&U_m\\
   137 \end{array}\eqno(1.2)
   138 $$
   139 \noindent\hspace{.7in}and bounds of variables
   140 $$
   141 \begin{array}{l@{\ }c@{\ }c@{\ }c@{\ }l}
   142 l_1&\leq&x_1&\leq&u_1\\
   143 l_2&\leq&x_2&\leq&u_2\\
   144 \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .}\\
   145 l_n&\leq&x_n&\leq&u_n\\
   146 \end{array}\eqno(1.3)
   147 $$
   148 where $x_1$, $x_2$, \dots, $x_n$ are variables; $z$ is the objective
   149 function; $c_1$, $c_2$, \dots, $c_n$ are objective coefficients; $c_0$
   150 is the constant term (``shift'') of the objective function; $a_{11}$,
   151 $a_{12}$, \dots, $a_{mn}$ are constraint coefficients; $L_1$, $L_2$,
   152 \dots, $L_m$ are lower constraint bounds; $U_1$, $U_2$, \dots, $U_m$
   153 are upper constraint bounds; $l_1$, $l_2$, \dots, $l_n$ are lower
   154 bounds of variables; $u_1$, $u_2$, \dots, $u_n$ are upper bounds of
   155 variables.
   156 
   157 Bounds of variables and constraint bounds can be finite as well as
   158 infinite. Besides, lower bounds can be equal to corresponding upper
   159 bounds. Thus, the following types of variables and constraints are
   160 allowed:
   161 
   162 \newpage
   163 
   164 \begin{tabular}{@{}r@{\ }c@{\ }c@{\ }c@{\ }l@{\hspace*{38pt}}l}
   165 $-\infty$&$<$&$x$&$<$&$+\infty$&Free (unbounded) variable\\
   166 $l$&$\leq$&$x$&$<$&$+\infty$&Variable with lower bound\\
   167 $-\infty$&$<$&$x$&$\leq$&$u$&Variable with upper bound\\
   168 $l$&$\leq$&$x$&$\leq$&$u$&Double-bounded variable\\
   169 $l$&$=$&$x$&=&$u$&Fixed variable\\
   170 \end{tabular}
   171 
   172 \bigskip
   173 
   174 \begin{tabular}{@{}r@{\ }c@{\ }c@{\ }c@{\ }ll}
   175 $-\infty$&$<$&$\sum a_jx_j$&$<$&$+\infty$&Free (unbounded) linear
   176 form\\
   177 $L$&$\leq$&$\sum a_jx_j$&$<$&$+\infty$&Inequality constraint ``greater
   178 than or equal to''\\
   179 $-\infty$&$<$&$\sum a_jx_j$&$\leq$&$U$&Inequality constraint ``less
   180 than or equal to''\\
   181 $L$&$\leq$&$\sum a_jx_j$&$\leq$&$U$&Double-bounded inequality
   182 constraint\\
   183 $L$&$=$&$\sum a_jx_j$&=&$U$&Equality constraint\\
   184 \end{tabular}
   185 
   186 \bigskip
   187 
   188 In addition to pure LP problems MathProg also allows mixed integer
   189 linear programming (MIP) problems, where some or all variables are
   190 restricted to be integer or binary.
   191 
   192 \subsection{Model objects}
   193 
   194 In MathProg the model is described in terms of sets, parameters,
   195 variables, constraints, and objectives, which are called {\it model
   196 objects}.
   197 
   198 The user introduces particular model objects using the language
   199 statements. Each model object is provided with a symbolic name that
   200 uniquely identifies the object and is intended for referencing purposes.
   201 
   202 Model objects, including sets, can be multidimensional arrays built
   203 over indexing sets. Formally, $n$-dimensional array $A$ is the mapping:
   204 $$A:\Delta\rightarrow\Xi,\eqno(1.4)$$
   205 where $\Delta\subseteq S_1\times\dots\times S_n$ is a subset of the
   206 Cartesian product of indexing sets,\linebreak $\Xi$ is a set of array members.
   207 In MathProg the set $\Delta$ is called the {\it subscript domain}. Its
   208 members are $n$-tuples $(i_1,\dots,i_n)$, where $i_1\in S_1$, \dots,
   209 $i_n\in S_n$.
   210 
   211 If $n=0$, the Cartesian product above has exactly one member (namely,
   212 \linebreak 0-tuple), so it is convenient to think scalar objects as
   213 0-dimensional arrays having one member.
   214 
   215 The type of array members is determined by the type of corresponding
   216 model object as follows:
   217 
   218 \medskip
   219 
   220 \noindent\hfil
   221 \begin{tabular}{@{}ll@{}}
   222 Model object&Array member\\
   223 \hline
   224 Set&Elemental plain set\\
   225 Parameter&Number or symbol\\
   226 Variable&Elemental variable\\
   227 Constraint&Elemental constraint\\
   228 Objective&Elemental objective\\
   229 \end{tabular}
   230 
   231 \medskip
   232 
   233 In order to refer to a particular object member the object should be
   234 provided with {\it subscripts}. For example, if $a$ is a 2-dimensional
   235 parameter defined over $I\times J$, a reference to its particular
   236 member can be written as $a[i,j]$, where $i\in I$ and $j\in J$. It is
   237 understood that scalar objects being 0-dimensional need no subscripts.
   238 
   239 \subsection{Structure of model description}
   240 
   241 It is sometimes desirable to write a model which, at various points,
   242 may require different data for each problem instance to be solved using
   243 that model. For this reason in MathProg the model description consists
   244 of two parts: the {\it model section} and the {\it data section}.
   245 
   246 The model section is a main part of the model description that contains
   247 declarations of model objects and is common for all problems based on
   248 the corresponding model.
   249 
   250 The data section is an optional part of the model description that
   251 contains data specific for a particular problem instance.
   252 
   253 Depending on what is more convenient the model and data sections can be
   254 placed either in one file or in two separate files. The latter feature
   255 allows having arbitrary number of different data sections to be used
   256 with the same model section.
   257 
   258 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   259 
   260 \newpage
   261 
   262 \section{Coding model description}
   263 \label{coding}
   264 
   265 The model description is coded in plain text format using ASCII
   266 character set. Characters valid in the model description are the
   267 following:
   268 
   269 \begin{itemize}
   270 \item alphabetic characters:\\
   271 \verb|A B C D E F G H I J K L M N O P Q R S T U V W X Y Z|\\
   272 \verb|a b c d e f g h i j k l m n o p q r s t u v w x y z _|
   273 \item numeric characters:\\
   274 \verb|0 1 2 3 4 5 6 7 8 9|
   275 \item special characters:\\
   276 \verb?! " # & ' ( ) * + , - . / : ; < = > [ ] ^ { | }?
   277 \item white-space characters:\\
   278 \verb|SP HT CR NL VT FF|
   279 \end{itemize}
   280 
   281 Within string literals and comments any ASCII characters (except
   282 control characters) are valid.
   283 
   284 White-space characters are non-significant. They can be used freely
   285 between lexical units to improve readability of the model description.
   286 They are also used to separate lexical units from each other if there
   287 is no other way to do that.
   288 
   289 Syntactically model description is a sequence of lexical units in the
   290 following categories:
   291 
   292 \begin{itemize}
   293 \item symbolic names;
   294 \item numeric literals;
   295 \item string literals;
   296 \item keywords;
   297 \item delimiters;
   298 \item comments.
   299 \end{itemize}
   300 
   301 The lexical units of the language are discussed below.
   302 
   303 \subsection{Symbolic names}
   304 
   305 A {\it symbolic name} consists of alphabetic and numeric characters,
   306 the first of which must be alphabetic. All symbolic names are distinct
   307 (case sensitive).
   308 
   309 \medskip
   310 
   311 \noindent{\bf Examples}
   312 
   313 \medskip
   314 
   315 \noindent\verb|alpha123|
   316 
   317 \noindent\verb|This_is_a_name|
   318 
   319 \noindent\verb|_P123_abc_321|
   320 
   321 \newpage
   322 
   323 Symbolic names are used to identify model objects (sets, parameters,
   324 variables, constraints, objectives) and dummy indices.
   325 
   326 All symbolic names (except names of dummy indices) must be unique, i.e.
   327 the model description must have no objects with identical names.
   328 Symbolic names of dummy indices must be unique within the scope, where
   329 they are valid.
   330 
   331 \subsection{Numeric literals}
   332 
   333 A {\it numeric literal} has the form {\it xx}{\tt E}{\it syy}, where
   334 {\it xx} is a number with optional decimal point, {\it s} is the sign
   335 {\tt+} or {\tt-}, {\it yy} is a decimal exponent. The letter {\tt E} is
   336 case insensitive and can be coded as {\tt e}.
   337 
   338 \medskip
   339 
   340 \noindent{\bf Examples}
   341 
   342 \medskip
   343 
   344 \noindent\verb|123|
   345 
   346 \noindent\verb|3.14159|
   347 
   348 \noindent\verb|56.E+5|
   349 
   350 \noindent\verb|.78|
   351 
   352 \noindent\verb|123.456e-7|
   353 
   354 \medskip
   355 
   356 Numeric literals are used to represent numeric quantities. They have
   357 obvious fixed meaning.
   358 
   359 \subsection{String literals}
   360 
   361 A {\it string literal} is a sequence of arbitrary characters enclosed
   362 either in single quotes or in double quotes. Both these forms are
   363 equivalent.
   364 
   365 If the single quote is part of a string literal enclosed in single
   366 quotes, it must be coded twice. Analogously, if the double quote is
   367 part of a string literal enclosed in double quotes, it must be coded
   368 twice.
   369 
   370 \medskip
   371 
   372 \noindent{\bf Examples}
   373 
   374 \medskip
   375 
   376 \noindent\verb|'This is a string'|
   377 
   378 \noindent\verb|"This is another string"|
   379 
   380 \noindent\verb|'1 + 2 = 3'|
   381 
   382 \noindent\verb|'That''s all'|
   383 
   384 \noindent\verb|"She said: ""No"""|
   385 
   386 \medskip
   387 
   388 String literals are used to represent symbolic quantities.
   389 
   390 \subsection{Keywords}
   391 
   392 A {\it keyword} is a sequence of alphabetic characters and possibly
   393 some special characters.
   394 
   395 All keywords fall into two categories: {\it reserved keywords}, which
   396 cannot be used as symbolic names, and {\it non-reserved keywords},
   397 which being recognized by context can be used as symbolic names.
   398 
   399 \newpage
   400 
   401 The reserved keywords are the following:
   402 
   403 \medskip
   404 
   405 \noindent\hfil
   406 \begin{tabular}{@{}p{.7in}p{.7in}p{.7in}p{.7in}@{}}
   407 {\tt and}&{\tt else}&{\tt mod}&{\tt union}\\
   408 {\tt by}&{\tt if}&{\tt not}&{\tt within}\\
   409 {\tt cross}&{\tt in}&{\tt or}\\
   410 {\tt diff}&{\tt inter}&{\tt symdiff}\\
   411 {\tt div}&{\tt less}&{\tt then}\\
   412 \end{tabular}
   413 
   414 \medskip
   415 
   416 Non-reserved keywords are described in following sections.
   417 
   418 All the keywords have fixed meaning, which will be explained on
   419 discussion of corresponding syntactic constructions, where the keywords
   420 are used.
   421 
   422 \subsection{Delimiters}
   423 
   424 A {\it delimiter} is either a single special character or a sequence of
   425 two special characters as follows:
   426 
   427 \medskip
   428 
   429 \noindent\hfil
   430 \begin{tabular}{@{}p{.3in}p{.3in}p{.3in}p{.3in}p{.3in}p{.3in}@{}}
   431 {\tt+}&{\tt\textasciicircum}&{\tt==}&{\tt!}&{\tt:}&{\tt)}\\
   432 {\tt-}&{\tt\&}&{\tt>=}&{\tt\&\&}&{\tt;}&{\tt[}\\
   433 {\tt*}&{\tt<}&{\tt>}&{\tt||}&{\tt:=}&{\tt|}\\
   434 {\tt/}&{\tt<=}&{\tt<>}&{\tt.}&{\tt..}&{\tt\{}\\
   435 {\tt**}&{\tt=}&{\tt!=}&{\tt,}&{\tt(}&{\tt\}}\\
   436 \end{tabular}
   437 
   438 \medskip
   439 
   440 If the delimiter consists of two characters, there must be no spaces
   441 between the characters.
   442 
   443 All the delimiters have fixed meaning, which will be explained on
   444 discussion corresponding syntactic constructions, where the delimiters
   445 are used.
   446 
   447 \subsection{Comments}
   448 
   449 For documenting purposes the model description can be provided with
   450 {\it comments}, which may have two different forms. The first form is
   451 a {\it single-line comment}, which begins with the character {\tt\#}
   452 and extends until end of line. The second form is a {\it comment
   453 sequence}, which is a sequence of any characters enclosed within
   454 {\tt/*} and {\tt*/}.
   455 
   456 \medskip
   457 
   458 \noindent{\bf Examples}
   459 
   460 \medskip
   461 
   462 \noindent\verb|param n := 10; # This is a comment|
   463 
   464 \noindent\verb|/* This is another comment */|
   465 
   466 \medskip
   467 
   468 Comments are ignored by the model translator and can appear anywhere in
   469 the model description, where white-space characters are allowed.
   470 
   471 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   472 
   473 \newpage
   474 
   475 \section{Expressions}
   476 
   477 An {\it expression} is a rule for computing a value. In model
   478 description expressions are used as constituents of certain statements.
   479 
   480 In general case expressions consist of operands and operators.
   481 
   482 Depending on the type of the resultant value all expressions fall into
   483 the following categories:
   484 
   485 \begin{itemize}
   486 \item numeric expressions;
   487 \item symbolic expressions;
   488 \item indexing expressions;
   489 \item set expressions;
   490 \item logical expressions;
   491 \item linear expressions.
   492 \end{itemize}
   493 
   494 \subsection{Numeric expressions}
   495 
   496 A {\it numeric expression} is a rule for computing a single numeric
   497 value represented as a floating-point number.
   498 
   499 The primary numeric expression may be a numeric literal, dummy index,
   500 unsubscripted parameter, subscripted parameter, built-in function
   501 reference, iterated numeric expression, conditional numeric expression,
   502 or another numeric expression enclosed in parentheses.
   503 
   504 \medskip
   505 
   506 \noindent{\bf Examples}
   507 
   508 \medskip
   509 
   510 \noindent
   511 \begin{tabular}{@{}ll@{}}
   512 \verb|1.23|&(numeric literal)\\
   513 \verb|j|&(dummy index)\\
   514 \verb|time|&(unsubscripted parameter)\\
   515 \verb|a['May 2003',j+1]|&(subscripted parameter)\\
   516 \verb|abs(b[i,j])|&(function reference)\\
   517 \verb|sum{i in S diff T} alpha[i] * b[i,j]|&(iterated expression)\\
   518 \verb|if i in I then 2 * p else q[i+1]|&(conditional expression)\\
   519 \verb|(b[i,j] + .5 * c)|&(parenthesized expression)\\
   520 \end{tabular}
   521 
   522 \medskip
   523 
   524 More general numeric expressions containing two or more primary numeric
   525 expressions may be constructed by using certain arithmetic operators.
   526 
   527 \medskip
   528 
   529 \noindent{\bf Examples}
   530 
   531 \medskip
   532 
   533 \noindent\verb|j+1|
   534 
   535 \noindent\verb|2 * a[i-1,j+1] - b[i,j]|
   536 
   537 \noindent\verb|sum{j in J} a[i,j] * x[j] + sum{k in K} b[i,k] * x[k]|
   538 
   539 \noindent\verb|(if i in I then 2 * p else q[i+1]) / (a[i,j] + 1.5)|
   540 
   541 \subsubsection{Numeric literals}
   542 
   543 If the primary numeric expression is a numeric literal, the resultant
   544 value is obvious.
   545 
   546 \subsubsection{Dummy indices}
   547 
   548 If the primary numeric expression is a dummy index, the resultant value
   549 is current value assigned to that dummy index.
   550 
   551 \subsubsection{Unsubscripted parameters}
   552 
   553 If the primary numeric expression is an unsubscripted parameter (which
   554 must be 0-dimensional), the resultant value is the value of that
   555 parameter.
   556 
   557 \subsubsection{Subscripted parameters}
   558 
   559 The primary numeric expression, which refers to a subscripted parameter,
   560 has the following syntactic form:
   561 
   562 \medskip
   563 
   564 \noindent\hfil
   565 {\it name}{\tt[}$i_1${\tt,} $i_2${\tt,} \dots{\tt,} $i_n${\tt]}
   566 
   567 \medskip
   568 
   569 \noindent where {\it name} is the symbolic name of the parameter,
   570 $i_1$, $i_2$, \dots, $i_n$ are subscripts.
   571 
   572 Each subscript must be a numeric or symbolic expression. The number of
   573 subscripts in the subscript list must be the same as the dimension of
   574 the parameter with which the subscript list is associated.
   575 
   576 Actual values of subscript expressions are used to identify
   577 a particular member of the parameter that determines the resultant
   578 value of the primary expression.
   579 
   580 \subsubsection{Function references}
   581 
   582 In MathProg there exist the following built-in functions which may be
   583 used in numeric expressions:
   584 
   585 \medskip
   586 
   587 \begin{tabular}{@{}p{96pt}p{222pt}@{}}
   588 {\tt abs(}$x${\tt)}&$|x|$, absolute value of $x$\\
   589 {\tt atan(}$x${\tt)}&$\arctan x$, principal value of the arc tangent of
   590 $x$ (in radians)\\
   591 {\tt atan(}$y${\tt,} $x${\tt)}&$\arctan y/x$, principal value of the
   592 arc tangent of $y/x$ (in radians). In this case the signs of both
   593 arguments $y$ and $x$ are used to determine the quadrant of the
   594 resultant value\\
   595 {\tt card(}$X${\tt)}&$|X|$, cardinality (the number of elements) of
   596 set $X$\\
   597 {\tt ceil(}$x${\tt)}&$\lceil x\rceil$, smallest integer not less than
   598 $x$ (``ceiling of $x$'')\\
   599 {\tt cos(}$x${\tt)}&$\cos x$, cosine of $x$ (in radians)\\
   600 {\tt exp(}$x${\tt)}&$e^x$, base-$e$ exponential of $x$\\
   601 {\tt floor(}$x${\tt)}&$\lfloor x\rfloor$, largest integer not greater
   602 than $x$ (``floor of $x$'')\\
   603 \end{tabular}
   604 
   605 \begin{tabular}{@{}p{96pt}p{222pt}@{}}
   606 {\tt gmtime()}&the number of seconds elapsed since 00:00:00~Jan~1, 1970,
   607 Coordinated Universal Time (for details see Subsection \ref{gmtime},
   608 page \pageref{gmtime})\\
   609 {\tt length(}$s${\tt)}&$|s|$, length of character string $s$\\
   610 {\tt log(}$x${\tt)}&$\log x$, natural logarithm of $x$\\
   611 {\tt log10(}$x${\tt)}&$\log_{10}x$, common (decimal) logarithm of $x$\\
   612 {\tt max(}$x_1${\tt,} $x_2${\tt,} \dots{\tt,} $x_n${\tt)}&the largest
   613 of values $x_1$, $x_2$, \dots, $x_n$\\
   614 {\tt min(}$x_1${\tt,} $x_2${\tt,} \dots{\tt,} $x_n${\tt)}&the smallest
   615 of values $x_1$, $x_2$, \dots, $x_n$\\
   616 {\tt round(}$x${\tt)}&rounding $x$ to nearest integer\\
   617 {\tt round(}$x${\tt,} $n${\tt)}&rounding $x$ to $n$ fractional decimal
   618 digits\\
   619 {\tt sin(}$x${\tt)}&$\sin x$, sine of $x$ (in radians)\\
   620 {\tt sqrt(}$x${\tt)}&$\sqrt{x}$, non-negative square root of $x$\\
   621 {\tt str2time(}$s${\tt,} $f${\tt)}&converting character string $s$ to
   622 calendar time (for details see Subsection \ref{str2time}, page
   623 \pageref{str2time})\\
   624 {\tt trunc(}$x${\tt)}&truncating $x$ to nearest integer\\
   625 {\tt trunc(}$x${\tt,} $n${\tt)}&truncating $x$ to $n$ fractional
   626 decimal digits\\
   627 {\tt Irand224()}&generating pseudo-random integer uniformly distributed
   628 in $[0,2^{24})$\\
   629 {\tt Uniform01()}&generating pseudo-random number uniformly distributed
   630 in $[0,1)$\\
   631 {\tt Uniform(}$a${\tt,} $b${\tt)}&generating pseudo-random number
   632 uniformly distributed in $[a,b)$\\
   633 {\tt Normal01()}&generating Gaussian pseudo-random variate with
   634 $\mu=0$ and $\sigma=1$\\
   635 {\tt Normal(}$\mu${\tt,} $\sigma${\tt)}&generating Gaussian
   636 pseudo-random variate with given $\mu$ and $\sigma$\\
   637 \end{tabular}
   638 
   639 \medskip
   640 
   641 Arguments of all built-in functions, except {\tt card}, {\tt length},
   642 and {\tt str2time}, must be numeric expressions. The argument of
   643 {\tt card} must be a set expression. The argument of {\tt length} and
   644 both arguments of {\tt str2time} must be symbolic expressions.
   645 
   646 The resultant value of the numeric expression, which is a function
   647 reference, is the result of applying the function to its argument(s).
   648 
   649 Note that each pseudo-random generator function has a latent argument
   650 (i.e. some internal state), which is changed whenever the function has
   651 been applied. Thus, if the function is applied repeatedly even to
   652 identical arguments, due to the side effect different resultant values
   653 are always produced.
   654 
   655 \subsubsection{Iterated expressions}
   656 \label{itexpr}
   657 
   658 An {\it iterated numeric expression} is a primary numeric expression,
   659 which has the following syntactic form:
   660 
   661 \medskip
   662 
   663 \noindent\hfil
   664 {\it iterated-operator indexing-expression integrand}
   665 
   666 \medskip
   667 
   668 \noindent where {\it iterated-operator} is the symbolic name of the
   669 iterated operator to be performed (see below), {\it indexing-expression}
   670 is an indexing expression which introduces dummy indices and controls
   671 iterating, {\it integrand} is a numeric expression that participates in
   672 the operation.
   673 
   674 In MathProg there exist four iterated operators, which may be used in
   675 numeric expressions:
   676 
   677 \medskip
   678 
   679 \noindent\hfil
   680 \begin{tabular}{@{}lll@{}}
   681 {\tt sum}&summation&$\displaystyle\sum_{(i_1,\dots,i_n)\in\Delta}
   682 f(i_1,\dots,i_n)$\\
   683 {\tt prod}&production&$\displaystyle\prod_{(i_1,\dots,i_n)\in\Delta}
   684 f(i_1,\dots,i_n)$\\
   685 {\tt min}&minimum&$\displaystyle\min_{(i_1,\dots,i_n)\in\Delta}
   686 f(i_1,\dots,i_n)$\\
   687 {\tt max}&maximum&$\displaystyle\max_{(i_1,\dots,i_n)\in\Delta}
   688 f(i_1,\dots,i_n)$\\
   689 \end{tabular}
   690 
   691 \medskip
   692 
   693 \noindent where $i_1$, \dots, $i_n$ are dummy indices introduced in
   694 the indexing expression, $\Delta$ is the domain, a set of $n$-tuples
   695 specified by the indexing expression which defines particular values
   696 assigned to the dummy indices on performing the iterated operation,
   697 $f(i_1,\dots,i_n)$ is the integrand, a numeric expression whose
   698 resultant value depends on the dummy indices.
   699 
   700 The resultant value of an iterated numeric expression is the result of
   701 applying of the iterated operator to its integrand over all $n$-tuples
   702 contained in the domain.
   703 
   704 \subsubsection{Conditional expressions}
   705 \label{ifthen}
   706 
   707 A {\it conditional numeric expression} is a primary numeric expression,
   708 which has one of the following two syntactic forms:
   709 
   710 \medskip
   711 
   712 \noindent\hfil
   713 {\tt if} $b$ {\tt then} $x$ {\tt else} $y$
   714 
   715 \medskip
   716 
   717 \noindent\hspace{126.5pt}
   718 {\tt if} $b$ {\tt then} $x$
   719 
   720 \medskip
   721 
   722 \noindent where $b$ is an logical expression, $x$ and $y$ are numeric
   723 expressions.
   724 
   725 The resultant value of the conditional expression depends on the value
   726 of the logical expression that follows the keyword {\tt if}. If it
   727 takes on the value {\it true}, the value of the conditional expression
   728 is the value of the expression that follows the keyword {\tt then}.
   729 Otherwise, if the logical expression takes on the value {\it false},
   730 the value of the conditional expression is the value of the expression
   731 that follows the keyword {\it else}. If the second, reduced form of the
   732 conditional expression is used and the logical expression takes on the
   733 value {\it false}, the resultant value of the conditional expression is
   734 zero.
   735 
   736 \subsubsection{Parenthesized expressions}
   737 
   738 Any numeric expression may be enclosed in parentheses that
   739 syntactically makes it a primary numeric expression.
   740 
   741 Parentheses may be used in numeric expressions, as in algebra, to
   742 specify the desired order in which operations are to be performed.
   743 Where parentheses are used, the expression within the parentheses is
   744 evaluated before the resultant value is used.
   745 
   746 The resultant value of the parenthesized expression is the same as the
   747 value of the expression enclosed within parentheses.
   748 
   749 \subsubsection{Arithmetic operators}
   750 
   751 In MathProg there exist the following arithmetic operators, which may
   752 be used in numeric expressions:
   753 
   754 \medskip
   755 
   756 \begin{tabular}{@{}p{96pt}p{222pt}@{}}
   757 {\tt +} $x$&unary plus\\
   758 {\tt -} $x$&unary minus\\
   759 $x$ {\tt +} $y$&addition\\
   760 $x$ {\tt -} $y$&subtraction\\
   761 $x$ {\tt less} $y$&positive difference (if $x<y$ then 0 else $x-y$)\\
   762 $x$ {\tt *} $y$&multiplication\\
   763 $x$ {\tt /} $y$&division\\
   764 $x$ {\tt div} $y$&quotient of exact division\\
   765 $x$ {\tt mod} $y$&remainder of exact division\\
   766 $x$ {\tt **} $y$, $x$ {\tt\textasciicircum} $y$&exponentiation (raising
   767 to power)\\
   768 \end{tabular}
   769 
   770 \medskip
   771 
   772 \noindent where $x$ and $y$ are numeric expressions.
   773 
   774 If the expression includes more than one arithmetic operator, all
   775 operators are performed from left to right according to the hierarchy
   776 of operations (see below) with the only exception that the
   777 exponentiaion operators are performed from right to left.
   778 
   779 The resultant value of the expression, which contains arithmetic
   780 operators, is the result of applying the operators to their operands.
   781 
   782 \subsubsection{Hierarchy of operations}
   783 \label{hierarchy}
   784 
   785 The following list shows the hierarchy of operations in numeric
   786 expressions:
   787 
   788 \medskip
   789 
   790 \noindent\hfil
   791 \begin{tabular}{@{}ll@{}}
   792 Operation&Hierarchy\\
   793 \hline
   794 Evaluation of functions ({\tt abs}, {\tt ceil}, etc.)&1st\\
   795 Exponentiation ({\tt**}, {\tt\textasciicircum})&2nd\\
   796 Unary plus and minus ({\tt+}, {\tt-})&3rd\\
   797 Multiplication and division ({\tt*}, {\tt/}, {\tt div}, {\tt mod})&4th\\
   798 Iterated operations ({\tt sum}, {\tt prod}, {\tt min}, {\tt max})&5th\\
   799 Addition and subtraction ({\tt+}, {\tt-}, {\tt less})&6th\\
   800 Conditional evaluation ({\tt if} \dots {\tt then} \dots {\tt else})&
   801 7th\\
   802 \end{tabular}
   803 
   804 \medskip
   805 
   806 This hierarchy is used to determine which of two consecutive operations
   807 is performed first. If the first operator is higher than or equal to
   808 the second, the first operation is performed. If it is not, the second
   809 operator is compared to the third, etc. When the end of the expression
   810 is reached, all of the remaining operations are performed in the
   811 reverse order.
   812 
   813 \newpage
   814 
   815 \subsection{Symbolic expressions}
   816 
   817 A {\it symbolic expression} is a rule for computing a single symbolic
   818 value represented as a character string.
   819 
   820 The primary symbolic expression may be a string literal, dummy index,
   821 unsubscripted parameter, subscripted parameter, built-in function
   822 reference, conditional symbolic expression, or another symbolic
   823 expression enclosed in parentheses.
   824 
   825 It is also allowed to use a numeric expression as the primary symbolic
   826 expression, in which case the resultant value of the numeric expression
   827 is automatically converted to the symbolic type.
   828 
   829 \medskip
   830 
   831 \noindent{\bf Examples}
   832 
   833 \medskip
   834 
   835 \noindent
   836 \begin{tabular}{@{}ll@{}}
   837 \verb|'May 2003'|&(string literal)\\
   838 \verb|j|&(dummy index)\\
   839 \verb|p|&(unsubscripted parameter)\\
   840 \verb|s['abc',j+1]|&(subscripted parameter)\\
   841 \verb|substr(name[i],k+1,3)|&(function reference)\\
   842 \verb|if i in I then s[i,j] else t[i+1]|&(conditional expression)\\
   843 \verb|((10 * b[i,j]) & '.bis')|&(parenthesized expression)\\
   844 \end{tabular}
   845 
   846 \medskip
   847 
   848 More general symbolic expressions containing two or more primary
   849 symbolic expressions may be constructed by using the concatenation
   850 operator.
   851 
   852 \medskip
   853 
   854 \noindent{\bf Examples}
   855 
   856 \medskip
   857 
   858 \noindent\verb|'abc[' & i & ',' & j & ']'|
   859 
   860 \noindent\verb|"from " & city[i] & " to " & city[j]|
   861 
   862 \medskip
   863 
   864 The principles of evaluation of symbolic expressions are completely
   865 analogous to the ones given for numeric expressions (see above).
   866 
   867 \subsubsection{Function references}
   868 
   869 In MathProg there exist the following built-in functions which may be
   870 used in symbolic expressions:
   871 
   872 \medskip
   873 
   874 \begin{tabular}{@{}p{96pt}p{222pt}@{}}
   875 {\tt substr(}$s${\tt,} $x${\tt)}&substring of $s$ starting from
   876 position $x$\\
   877 {\tt substr(}$s${\tt,} $x${\tt,} $y${\tt)}&substring of $s$ starting
   878 from position $x$ and having length $y$\\
   879 {\tt time2str(}$t${\tt,} $f${\tt)}&converting calendar time to
   880 character string (for details see Subsection \ref{time2str}, page
   881 \pageref{time2str})\\
   882 \end{tabular}
   883 
   884 \medskip
   885 
   886 The first argument of {\tt substr} must be a symbolic expression while
   887 its second and optional third arguments must be numeric expressions.
   888 
   889 The first argument of {\tt time2str} must be a numeric expression, and
   890 its second argument must be a symbolic expression.
   891 
   892 The resultant value of the symbolic expression, which is a function
   893 reference, is the result of applying the function to its arguments.
   894 
   895 \subsubsection{Symbolic operators}
   896 
   897 Currently in MathProg there exists the only symbolic operator:
   898 
   899 \medskip
   900 
   901 \noindent\hfil
   902 {\tt s \& t}
   903 
   904 \medskip
   905 
   906 \noindent where $s$ and $t$ are symbolic expressions. This operator
   907 means concatenation of its two symbolic operands, which are character
   908 strings.
   909 
   910 \subsubsection{Hierarchy of operations}
   911 
   912 The following list shows the hierarchy of operations in symbolic
   913 expressions:
   914 
   915 \medskip
   916 
   917 \noindent\hfil
   918 \begin{tabular}{@{}ll@{}}
   919 Operation&Hierarchy\\
   920 \hline
   921 Evaluation of numeric operations&1st-7th\\
   922 Concatenation ({\tt\&})&8th\\
   923 Conditional evaluation ({\tt if} \dots {\tt then} \dots {\tt else})&
   924 7th\\
   925 \end{tabular}
   926 
   927 \medskip
   928 
   929 This hierarchy has the same meaning as was explained above for numeric
   930 expressions (see Subsection \ref{hierarchy}, page \pageref{hierarchy}).
   931 
   932 \subsection{Indexing expressions and dummy indices}
   933 \label{indexing}
   934 
   935 An {\it indexing expression} is an auxiliary construction, which
   936 specifies a plain set of $n$-tuples and introduces dummy indices. It
   937 has two syntactic forms:
   938 
   939 \medskip
   940 
   941 \noindent\hspace{73.5pt}
   942 {\tt\{} {\it entry}$_1${\tt,} {\it entry}$_2${\tt,} \dots{\tt,}
   943 {\it entry}$_m$ {\tt\}}
   944 
   945 \medskip
   946 
   947 \noindent\hfil
   948 {\tt\{} {\it entry}$_1${\tt,} {\it entry}$_2${\tt,} \dots{\tt,}
   949 {\it entry}$_m$ {\tt:} {\it predicate} {\tt\}}
   950 
   951 \medskip
   952 
   953 \noindent where {\it entry}{$_1$}, {\it entry}{$_2$}, \dots,
   954 {\it entry}{$_m$} are indexing entries, {\it predicate} is a logical
   955 expression that specifies an optional predicate (logical condition).
   956 
   957 Each {\it indexing entry} in the indexing expression has one of the
   958 following three forms:
   959 
   960 \medskip
   961 
   962 \noindent\hspace{123pt}
   963 $i$ {\tt in} $S$
   964 
   965 \medskip
   966 
   967 \noindent\hfil
   968 {\tt(}$i_1${\tt,} $i_2${\tt,} \dots{\tt,}$i_n${\tt)} {\tt in} $S$
   969 
   970 \medskip
   971 
   972 \noindent\hspace{123pt}
   973 $S$
   974 
   975 \medskip
   976 
   977 \noindent where $i_1$, $i_2$, \dots, $i_n$ are indices, $S$ is a set
   978 expression (discussed in the next section) that specifies the basic set.
   979 
   980 The number of indices in the indexing entry must be the same as the
   981 dimension of the basic set $S$, i.e. if $S$ consists of 1-tuples, the
   982 first form must be used, and if $S$ consists of $n$-tuples, where
   983 $n>1$, the second form must be used.
   984 
   985 If the first form of the indexing entry is used, the index $i$ can be
   986 a dummy index only (see below). If the second form is used, the indices
   987 $i_1$, $i_2$, \dots, $i_n$ can be either dummy indices or some numeric
   988 or symbolic expressions, where at least one index must be a dummy index.
   989 The third, reduced form of the indexing entry has the same effect as if
   990 there were $i$ (if $S$ is 1-dimensional) or $i_1$, $i_2$, \dots, $i_n$
   991 (if $S$ is $n$-dimensional) all specified as dummy indices.
   992 
   993 A {\it dummy index} is an auxiliary model object, which acts like an
   994 individual variable. Values assigned to dummy indices are components of
   995 $n$-tuples from basic sets, i.e. some numeric and symbolic quantities.
   996 
   997 For referencing purposes dummy indices can be provided with symbolic
   998 names. However, unlike other model objects (sets, parameters, etc.)
   999 dummy indices need not be explicitly declared. Each {\it undeclared}
  1000 symbolic name being used in the indexing position of an indexing entry
  1001 is recognized as the symbolic name of corresponding dummy index.
  1002 
  1003 Symbolic names of dummy indices are valid only within the scope of the
  1004 indexing expression, where the dummy indices were introduced. Beyond
  1005 the scope the dummy indices are completely inaccessible, so the same
  1006 symbolic names may be used for other purposes, in particular, to
  1007 represent dummy indices in other indexing expressions.
  1008 
  1009 The scope of indexing expression, where implicit declarations of dummy
  1010 indices are valid, depends on the context, in which the indexing
  1011 expression is used:
  1012 
  1013 \begin{enumerate}
  1014 \item If the indexing expression is used in iterated operator, its
  1015 scope extends until the end of the integrand.
  1016 \item If the indexing expression is used as a primary set expression,
  1017 its scope extends until the end of that indexing expression.
  1018 \item If the indexing expression is used to define the subscript domain
  1019 in declarations of some model objects, its scope extends until the end
  1020 of the corresponding statement.
  1021 \end{enumerate}
  1022 
  1023 The indexing mechanism implemented by means of indexing expressions is
  1024 best explained by some examples discussed below.
  1025 
  1026 Let there be given three sets:
  1027 
  1028 \medskip
  1029 
  1030 \noindent\hspace{33.5pt}
  1031 $A=\{4,7,9\}$,
  1032 
  1033 \medskip
  1034 
  1035 \noindent\hfil
  1036 $B=\{(1,Jan),(1,Feb),(2,Mar),(2,Apr),(3,May),(3,Jun)\}$,
  1037 
  1038 \medskip
  1039 
  1040 \noindent\hspace{33.5pt}
  1041 $C=\{a,b,c\}$,
  1042 
  1043 \medskip
  1044 
  1045 \noindent where $A$ and $C$ consist of 1-tuples (singlets), $B$
  1046 consists of 2-tuples (doublets). Consider the following indexing
  1047 expression:
  1048 
  1049 \medskip
  1050 
  1051 \noindent\hfil
  1052 {\tt\{i in A, (j,k) in B, l in C\}}
  1053 
  1054 \medskip
  1055 
  1056 \noindent where {\tt i}, {\tt j}, {\tt k}, and {\tt l} are dummy
  1057 indices.
  1058 
  1059 Although MathProg is not a procedural language, for any indexing
  1060 expression an equivalent algorithmic description can be given. In
  1061 particular, the algorithmic description of the indexing expression
  1062 above could look like follows:
  1063 
  1064 \medskip
  1065 
  1066 \noindent\hfil
  1067 \begin{tabular}{@{}l@{}}
  1068 {\bf for all} $i\in A$ {\bf do}\\
  1069 \hspace{12pt}{\bf for all} $(j,k)\in B$ {\bf do}\\
  1070 \hspace{24pt}{\bf for all} $l\in C$ {\bf do}\\
  1071 \hspace{36pt}{\it action};\\
  1072 \end{tabular}
  1073 
  1074 \newpage
  1075 
  1076 \noindent where the dummy indices $i$, $j$, $k$, $l$ are consecutively
  1077 assigned corresponding components of $n$-tuples from the basic sets $A$,
  1078 $B$, $C$, and {\it action} is some action that depends on the context,
  1079 where the indexing expression is used. For example, if the action were
  1080 printing current values of dummy indices, the printout would look like
  1081 follows:
  1082 
  1083 \medskip
  1084 
  1085 \noindent\hfil
  1086 \begin{tabular}{@{}llll@{}}
  1087 $i=4$&$j=1$&$k=Jan$&$l=a$\\
  1088 $i=4$&$j=1$&$k=Jan$&$l=b$\\
  1089 $i=4$&$j=1$&$k=Jan$&$l=c$\\
  1090 $i=4$&$j=1$&$k=Feb$&$l=a$\\
  1091 $i=4$&$j=1$&$k=Feb$&$l=b$\\
  1092 \multicolumn{4}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}\\
  1093 $i=9$&$j=3$&$k=Jun$&$l=b$\\
  1094 $i=9$&$j=3$&$k=Jun$&$l=c$\\
  1095 \end{tabular}
  1096 
  1097 \medskip
  1098 
  1099 Let the example indexing expression be used in the following iterated
  1100 operation:
  1101 
  1102 \medskip
  1103 
  1104 \noindent\hfil
  1105 {\tt sum\{i in A, (j,k) in B, l in C\} p[i,j,k,l]}
  1106 
  1107 \medskip
  1108 
  1109 \noindent where {\tt p} is a 4-dimensional numeric parameter or some
  1110 numeric expression whose resultant value depends on {\tt i}, {\tt j},
  1111 {\tt k}, and {\tt l}. In this case the action is summation, so the
  1112 resultant value of the primary numeric expression is:
  1113 $$\sum_{i\in A,(j,k)\in B,l\in C}(p_{ijkl}).$$
  1114 
  1115 Now let the example indexing expression be used as a primary set
  1116 expression. In this case the action is gathering all 4-tuples
  1117 (quadruplets) of the form $(i,j,k,l)$ in one set, so the resultant
  1118 value of such operation is simply the Cartesian product of the basic
  1119 sets:
  1120 $$A\times B\times C=\{(i,j,k,l):i\in A,(j,k)\in B,l\in C\}.$$
  1121 Note that in this case the same indexing expression might be written in
  1122 the reduced form:
  1123 
  1124 \medskip
  1125 
  1126 \noindent\hfil
  1127 {\tt\{A, B, C\}}
  1128 
  1129 \medskip
  1130 
  1131 \noindent because the dummy indices $i$, $j$, $k$, and $l$ are not
  1132 referenced and therefore their symbolic names need not be specified.
  1133 
  1134 Finally, let the example indexing expression be used as the subscript
  1135 domain in the declaration of a 4-dimensional model object, say,
  1136 a numeric parameter:
  1137 
  1138 \medskip
  1139 
  1140 \noindent\hfil
  1141 {\tt param p\{i in A, (j,k) in B, l in C\}} \dots {\tt;}
  1142 
  1143 \medskip
  1144 
  1145 \noindent In this case the action is generating the parameter members,
  1146 where each member has the form $p[i,j,k,l]$.
  1147 
  1148 As was said above, some indices in the second form of indexing entries
  1149 may be numeric or symbolic expressions, not only dummy indices. In this
  1150 case resultant values of such expressions play role of some logical
  1151 conditions to select only that $n$-tuples from the Cartesian product of
  1152 basic sets that satisfy these conditions.
  1153 
  1154 Consider, for example, the following indexing expression:
  1155 
  1156 \medskip
  1157 
  1158 \noindent\hfil
  1159 {\tt\{i in A, (i-1,k) in B, l in C\}}
  1160 
  1161 \medskip
  1162 
  1163 \noindent where {\tt i}, {\tt k}, {\tt l} are dummy indices, and
  1164 {\tt i-1} is a numeric expression. The algorithmic decsription of this
  1165 indexing expression is the following:
  1166 
  1167 \medskip
  1168 
  1169 \noindent\hfil
  1170 \begin{tabular}{@{}l@{}}
  1171 {\bf for all} $i\in A$ {\bf do}\\
  1172 \hspace{12pt}{\bf for all} $(j,k)\in B$ {\bf and} $j=i-1$ {\bf do}\\
  1173 \hspace{24pt}{\bf for all} $l\in C$ {\bf do}\\
  1174 \hspace{36pt}{\it action};\\
  1175 \end{tabular}
  1176 
  1177 \medskip
  1178 
  1179 \noindent Thus, if this indexing expression were used as a primary set
  1180 expression, the resultant set would be the following:
  1181 $$\{(4,May,a),(4,May,b),(4,May,c),(4,Jun,a),(4,Jun,b),(4,Jun,c)\}.$$
  1182 Should note that in this case the resultant set consists of 3-tuples,
  1183 not of 4-tuples, because in the indexing expression there is no dummy
  1184 index that corresponds to the first component of 2-tuples from the set
  1185 $B$.
  1186 
  1187 The general rule is: the number of components of $n$-tuples defined by
  1188 an indexing expression is the same as the number of dummy indices in
  1189 that expression, where the correspondence between dummy indices and
  1190 components on $n$-tuples in the resultant set is positional, i.e. the
  1191 first dummy index corresponds to the first component, the second dummy
  1192 index corresponds to the second component, etc.
  1193 
  1194 In some cases it is needed to select a subset from the Cartesian
  1195 product of some sets. This may be attained by using an optional logical
  1196 predicate, which is specified in the indexing expression.
  1197 
  1198 Consider, for example, the following indexing expression:
  1199 
  1200 \medskip
  1201 
  1202 \noindent\hfil
  1203 {\tt\{i in A, (j,k) in B, l in C: i <= 5 and k <> 'Mar'\}}
  1204 
  1205 \medskip
  1206 
  1207 \noindent where the logical expression following the colon is a
  1208 predicate. The algorithmic description of this indexing expression is
  1209 the following:
  1210 
  1211 \medskip
  1212 
  1213 \noindent\hfil
  1214 \begin{tabular}{@{}l@{}}
  1215 {\bf for all} $i\in A$ {\bf do}\\
  1216 \hspace{12pt}{\bf for all} $(j,k)\in B$ {\bf do}\\
  1217 \hspace{24pt}{\bf for all} $l\in C$ {\bf do}\\
  1218 \hspace{36pt}{\bf if} $i\leq 5$ {\bf and} $l\neq`Mar'$ {\bf then}\\
  1219 \hspace{48pt}{\it action};\\
  1220 \end{tabular}
  1221 
  1222 \medskip
  1223 
  1224 \noindent Thus, if this indexing expression were used as a primary set
  1225 expression, the resultant set would be the following:
  1226 $$\{(4,1,Jan,a),(4,1,Feb,a),(4,2,Apr,a),\dots,(4,3,Jun,c)\}.$$
  1227 
  1228 If no predicate is specified in the indexing expression, one, which
  1229 takes on the value {\it true}, is assumed.
  1230 
  1231 \subsection{Set expressions}
  1232 
  1233 A {\it set expression} is a rule for computing an elemental set, i.e.
  1234 a collection of $n$-tuples, where components of $n$-tuples are numeric
  1235 and symbolic quantities.
  1236 
  1237 The primary set expression may be a literal set, unsubscripted set,
  1238 subscripted set, ``arithmetic'' set, indexing expression, iterated set
  1239 expression, conditional set expression, or another set expression
  1240 enclosed in parentheses.
  1241 
  1242 \medskip
  1243 
  1244 \noindent{\bf Examples}
  1245 
  1246 \medskip
  1247 
  1248 \noindent
  1249 \begin{tabular}{@{}ll@{}}
  1250 \verb|{(123,'aa'), (i,'bb'), (j-1,'cc')}|&(literal set)\\
  1251 \verb|I|&(unsubscripted set)\\
  1252 \verb|S[i-1,j+1]|&(subscripted set)\\
  1253 \verb|1..t-1 by 2|&(``arithmetic'' set)\\
  1254 \verb|{t in 1..T, (t+1,j) in S: (t,j) in F}|&(indexing expression)\\
  1255 \verb|setof{i in I, j in J}(i+1,j-1)|&(iterated expression)\\
  1256 \verb|if i < j then S[i] else F diff S[j]|&(conditional expression)\\
  1257 \verb|(1..10 union 21..30)|&(parenthesized expression)\\
  1258 \end{tabular}
  1259 
  1260 \medskip
  1261 
  1262 More general set expressions containing two or more primary set
  1263 expressions may be constructed by using certain set operators.
  1264 
  1265 \medskip
  1266 
  1267 \noindent{\bf Examples}
  1268 
  1269 \medskip
  1270 
  1271 \noindent\verb|(A union B) inter (I cross J)|
  1272 
  1273 \noindent
  1274 \verb|1..10 cross (if i < j then {'a', 'b', 'c'} else {'d', 'e', 'f'})|
  1275 
  1276 \subsubsection{Literal sets}
  1277 
  1278 A {\it literal set} is a primary set expression, which has the
  1279 following two syntactic forms:
  1280 
  1281 \medskip
  1282 
  1283 \noindent\hspace{39pt}
  1284 {\tt\{}$e_1${\tt,} $e_2${\tt,} \dots{\tt,} $e_m${\tt\}}
  1285 
  1286 \medskip
  1287 
  1288 \noindent\hfil
  1289 {\tt\{(}$e_{11}${\tt,} \dots{\tt,} $e_{1n}${\tt),}
  1290 {\tt(}$e_{21}${\tt,} \dots{\tt,} $e_{2n}${\tt),} \dots{\tt,}
  1291 {\tt(}$e_{m1}${\tt,} \dots{\tt,} $e_{mn}${\tt)\}}
  1292 
  1293 \medskip
  1294 
  1295 \noindent where $e_1$, \dots, $e_m$, $e_{11}$, \dots, $e_{mn}$ are
  1296 numeric or symbolic expressions.
  1297 
  1298 If the first form is used, the resultant set consists of 1-tuples
  1299 (singlets) enumerated within the curly braces. It is allowed to specify
  1300 an empty set as {\tt\{\ \}}, which has no 1-tuples. If the second form
  1301 is used, the resultant set consists of $n$-tuples enumerated within the
  1302 curly braces, where a particular $n$-tuple consists of corresponding
  1303 components enumerated within the parentheses. All $n$-tuples must have
  1304 the same number of components.
  1305 
  1306 \subsubsection{Unsubscripted sets}
  1307 
  1308 If the primary set expression is an unsubscripted set (which must be
  1309 0-dimen\-sional), the resultant set is an elemental set associated with
  1310 the corresponding set object.
  1311 
  1312 \newpage
  1313 
  1314 \subsubsection{Subscripted sets}
  1315 
  1316 The primary set expression, which refers to a subscripted set, has the
  1317 following syntactic form:
  1318 
  1319 \medskip
  1320 
  1321 \noindent\hfil
  1322 {\it name}{\tt[}$i_1${\tt,} $i_2${\tt,} \dots{\tt,} $i_n${\tt]}
  1323 
  1324 \medskip
  1325 
  1326 \noindent where {\it name} is the symbolic name of the set object,
  1327 $i_1$, $i_2$, \dots, $i_n$ are subscripts.
  1328 
  1329 Each subscript must be a numeric or symbolic expression. The number of
  1330 subscripts in the subscript list must be the same as the dimension of
  1331 the set object with which the subscript list is associated.
  1332 
  1333 Actual values of subscript expressions are used to identify a
  1334 particular member of the set object that determines the resultant set.
  1335 
  1336 \subsubsection{``Arithmetic'' sets}
  1337 
  1338 The primary set expression, which is an ``arithmetic'' set, has the
  1339 following two syntactic forms:
  1340 
  1341 \medskip
  1342 
  1343 \noindent\hfil
  1344 $t_0$ {\tt..} $t_1$ {\tt by} $\delta t$
  1345 
  1346 \medskip
  1347 
  1348 \noindent\hspace{138.5pt}
  1349 $t_0$ {\tt..} $t_1$
  1350 
  1351 \medskip
  1352 
  1353 \noindent where $t_0$, $t_1$, and $\delta t$ are numeric expressions
  1354 (the value of $\delta t$ must not be zero). The second form is
  1355 equivalent to the first form, where $\delta t=1$.
  1356 
  1357 If $\delta t>0$, the resultant set is determined as follows:
  1358 $$\{t:\exists k\in{\cal Z}(t=t_0+k\delta t,\ t_0\leq t\leq t_1)\}.$$
  1359 Otherwise, if $\delta t<0$, the resultant set is determined as follows:
  1360 $$\{t:\exists k\in{\cal Z}(t=t_0+k\delta t,\ t_1\leq t\leq t_0)\}.$$
  1361 
  1362 \subsubsection{Indexing expressions}
  1363 
  1364 If the primary set expression is an indexing expression, the resultant
  1365 set is determined as described above in Subsection \ref{indexing}, page
  1366 \pageref{indexing}.
  1367 
  1368 \subsubsection{Iterated expressions}
  1369 
  1370 An {\it iterated set expression} is a primary set expression, which has
  1371 the following syntactic form:
  1372 
  1373 \medskip
  1374 
  1375 \noindent\hfil
  1376 {\tt setof} {\it indexing-expression} {\it integrand}
  1377 
  1378 \medskip
  1379 
  1380 \noindent where {\it indexing-expression} is an indexing expression,
  1381 which introduces dummy indices and controls iterating, {\it integrand}
  1382 is either a single numeric or symbolic expression or a list of numeric
  1383 and symbolic expressions separated by commae and enclosed in
  1384 parentheses.
  1385 
  1386 If the integrand is a single numeric or symbolic expression, the
  1387 resultant set consists of 1-tuples and is determined as follows:
  1388 $$\{x:(i_1,\dots,i_n)\in\Delta\},$$
  1389 \noindent where $x$ is a value of the integrand, $i_1$, \dots, $i_n$
  1390 are dummy indices introduced in the indexing expression, $\Delta$ is
  1391 the domain, a set of $n$-tuples specified by the indexing expression,
  1392 which defines particular values assigned to the dummy indices on
  1393 performing the iterated operation.
  1394 
  1395 If the integrand is a list containing $m$ numeric and symbolic
  1396 expressions, the resultant set consists of $m$-tuples and is determined
  1397 as follows:
  1398 $$\{(x_1,\dots,x_m):(i_1,\dots,i_n)\in\Delta\},$$
  1399 where $x_1$, \dots, $x_m$ are values of the expressions in the
  1400 integrand list, $i_1$, \dots, $i_n$ and $\Delta$ have the same meaning
  1401 as above.
  1402 
  1403 \subsubsection{Conditional expressions}
  1404 
  1405 A {\it conditional set expression} is a primary set expression that has
  1406 the following syntactic form:
  1407 
  1408 \medskip
  1409 
  1410 \noindent\hfil
  1411 {\tt if} $b$ {\tt then} $X$ {\tt else} $Y$
  1412 
  1413 \medskip
  1414 
  1415 \noindent where $b$ is an logical expression, $X$ and $Y$ are set
  1416 expressions, which must define sets of the same dimension.
  1417 
  1418 The resultant value of the conditional expression depends on the value
  1419 of the logical expression that follows the keyword {\tt if}. If it
  1420 takes on the value {\it true}, the resultant set is the value of the
  1421 expression that follows the keyword {\tt then}. Otherwise, if the
  1422 logical expression takes on the value {\it false}, the resultant set is
  1423 the value of the expression that follows the keyword {\tt else}.
  1424 
  1425 \subsubsection{Parenthesized expressions}
  1426 
  1427 Any set expression may be enclosed in parentheses that syntactically
  1428 makes it a primary set expression.
  1429 
  1430 Parentheses may be used in set expressions, as in algebra, to specify
  1431 the desired order in which operations are to be performed. Where
  1432 parentheses are used, the expression within the parentheses is
  1433 evaluated before the resultant value is used.
  1434 
  1435 The resultant value of the parenthesized expression is the same as the
  1436 value of the expression enclosed within parentheses.
  1437 
  1438 \subsubsection{Set operators}
  1439 
  1440 In MathProg there exist the following set operators, which may be used
  1441 in set expressions:
  1442 
  1443 \medskip
  1444 
  1445 \begin{tabular}{@{}p{96pt}p{222pt}@{}}
  1446 $X$ {\tt union} $Y$&union $X\cup Y$\\
  1447 $X$ {\tt diff} $Y$&difference $X\backslash Y$\\
  1448 $X$ {\tt symdiff} $Y$&symmetric difference $X\oplus Y$\\
  1449 $X$ {\tt inter} $Y$&intersection $X\cap Y$\\
  1450 $X$ {\tt cross} $Y$&cross (Cartesian) product $X\times Y$\\
  1451 \end{tabular}
  1452 
  1453 \medskip
  1454 
  1455 \noindent where $X$ and Y are set expressions, which must define sets
  1456 of the identical dimension (except the Cartesian product).
  1457 
  1458 If the expression includes more than one set operator, all operators
  1459 are performed from left to right according to the hierarchy of
  1460 operations (see below).
  1461 
  1462 The resultant value of the expression, which contains set operators, is
  1463 the result of applying the operators to their operands.
  1464 
  1465 The dimension of the resultant set, i.e. the dimension of $n$-tuples,
  1466 of which the resultant set consists of, is the same as the dimension of
  1467 the operands, except the Cartesian product, where the dimension of the
  1468 resultant set is the sum of the dimensions of its operands.
  1469 
  1470 \subsubsection{Hierarchy of operations}
  1471 
  1472 The following list shows the hierarchy of operations in set
  1473 expressions:
  1474 
  1475 \medskip
  1476 
  1477 \noindent\hfil
  1478 \begin{tabular}{@{}ll@{}}
  1479 Operation&Hierarchy\\
  1480 \hline
  1481 Evaluation of numeric operations&1st-7th\\
  1482 Evaluation of symbolic operations&8th-9th\\
  1483 Evaluation of iterated or ``arithmetic'' set ({\tt setof}, {\tt..})&
  1484 10th\\
  1485 Cartesian product ({\tt cross})&11th\\
  1486 Intersection ({\tt inter})&12th\\
  1487 Union and difference ({\tt union}, {\tt diff}, {\tt symdiff})&13th\\
  1488 Conditional evaluation ({\tt if} \dots {\tt then} \dots {\tt else})&
  1489 14th\\
  1490 \end{tabular}
  1491 
  1492 \medskip
  1493 
  1494 This hierarchy has the same meaning as was explained above for numeric
  1495 expressions (see Subsection \ref{hierarchy}, page \pageref{hierarchy}).
  1496 
  1497 \subsection{Logical expressions}
  1498 
  1499 A {\it logical expression} is a rule for computing a single logical
  1500 value, which can be either {\it true} or {\it false}.
  1501 
  1502 The primary logical expression may be a numeric expression, relational
  1503 expression, iterated logical expression, or another logical expression
  1504 enclosed in parentheses.
  1505 
  1506 \medskip
  1507 
  1508 \noindent{\bf Examples}
  1509 
  1510 \medskip
  1511 
  1512 \noindent
  1513 \begin{tabular}{@{}ll@{}}
  1514 \verb|i+1|&(numeric expression)\\
  1515 \verb|a[i,j] < 1.5|&(relational expression)\\
  1516 \verb|s[i+1,j-1] <> 'Mar'|&(relational expression)\\
  1517 \verb|(i+1,'Jan') not in I cross J|&(relational expression)\\
  1518 \verb|S union T within A[i] inter B[j]|&(relational expression)\\
  1519 \verb|forall{i in I, j in J} a[i,j] < .5 * b|&(iterated expression)\\
  1520 \verb|(a[i,j] < 1.5 or b[i] >= a[i,j])|&(parenthesized expression)\\
  1521 \end{tabular}
  1522 
  1523 \medskip
  1524 
  1525 More general logical expressions containing two or more primary logical
  1526 expressions may be constructed by using certain logical operators.
  1527 
  1528 \newpage
  1529 
  1530 \noindent{\bf Examples}
  1531 
  1532 \medskip
  1533 
  1534 \noindent\verb|not (a[i,j] < 1.5 or b[i] >= a[i,j]) and (i,j) in S|
  1535 
  1536 \noindent\verb|(i,j) in S or (i,j) not in T diff U|
  1537 
  1538 \subsubsection{Numeric expressions}
  1539 
  1540 The resultant value of the primary logical expression, which is a
  1541 numeric expression, is {\it true}, if the resultant value of the
  1542 numeric expression is non-zero. Otherwise the resultant value of the
  1543 logical expression is {\it false}.
  1544 
  1545 \subsubsection{Relational operators}
  1546 
  1547 In MathProg there exist the following relational operators, which may
  1548 be used in logical expressions:
  1549 
  1550 \medskip
  1551 
  1552 \begin{tabular}{@{}ll@{}}
  1553 $x$ {\tt<} $y$&test on $x<y$\\
  1554 $x$ {\tt<=} $y$&test on $x\leq y$\\
  1555 $x$ {\tt=} $y$, $x$ {\tt==} $y$&test on $x=y$\\
  1556 $x$ {\tt>=} $y$&test on $x\geq y$\\
  1557 $x$ {\tt>} $y$&test on $x>y$\\
  1558 $x$ {\tt<>} $y$, $x$ {\tt!=} $y$&test on $x\neq y$\\
  1559 $x$ {\tt in} $Y$&test on $x\in Y$\\
  1560 {\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt in} $Y$&test on
  1561 $(x_1,\dots,x_n)\in Y$\\
  1562 $x$ {\tt not} {\tt in} $Y$, $x$ {\tt!in} $Y$&test on $x\not\in Y$\\
  1563 {\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt not} {\tt in} $Y$,
  1564 {\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt !in} $Y$&test on
  1565 $(x_1,\dots,x_n)\not\in Y$\\
  1566 $X$ {\tt within} $Y$&test on $X\subseteq Y$\\
  1567 $X$ {\tt not} {\tt within} $Y$, $X$ {\tt !within} $Y$&test on
  1568 $X\not\subseteq Y$\\
  1569 \end{tabular}
  1570 
  1571 \medskip
  1572 
  1573 \noindent where $x$, $x_1$, \dots, $x_n$, $y$ are numeric or symbolic
  1574 expressions, $X$ and $Y$ are set expression.
  1575 
  1576 {\it Notes:}
  1577 
  1578 1. In the operations {\tt in}, {\tt not in}, and {\tt !in} the
  1579 number of components in the first operands must be the same as the
  1580 dimension of the second operand.
  1581 
  1582 2. In the operations {\tt within}, {\tt not within}, and {\tt !within}
  1583 both operands must have identical dimension.
  1584 
  1585 All the relational operators listed above have their conventional
  1586 mathematical meaning. The resultant value is {\it true}, if
  1587 corresponding relation is satisfied for its operands, otherwise
  1588 {\it false}. (Note that symbolic values are ordered lexicographically,
  1589 and any numeric value precedes any symbolic value.)
  1590 
  1591 \subsubsection{Iterated expressions}
  1592 
  1593 An {\it iterated logical expression} is a primary logical expression,
  1594 which has the following syntactic form:
  1595 
  1596 \medskip
  1597 
  1598 \noindent\hfil
  1599 {\it iterated-operator} {\it indexing-expression} {\it integrand}
  1600 
  1601 \medskip
  1602 
  1603 \noindent where {\it iterated-operator} is the symbolic name of the
  1604 iterated operator to be performed (see below), {\it indexing-expression}
  1605 is an indexing expression which introduces dummy indices and controls
  1606 iterating, {\it integrand} is a numeric expression that participates in
  1607 the operation.
  1608 
  1609 In MathProg there exist two iterated operators, which may be used in
  1610 logical expressions:
  1611 
  1612 \medskip
  1613 
  1614 \noindent\hfil
  1615 \begin{tabular}{@{}lll@{}}
  1616 {\tt forall}&$\forall$-quantification&$\displaystyle
  1617 \forall(i_1,\dots,i_n)\in\Delta[f(i_1,\dots,i_n)],$\\
  1618 {\tt exists}&$\exists$-quantification&$\displaystyle
  1619 \exists(i_1,\dots,i_n)\in\Delta[f(i_1,\dots,i_n)],$\\
  1620 \end{tabular}
  1621 
  1622 \medskip
  1623 
  1624 \noindent where $i_1$, \dots, $i_n$ are dummy indices introduced in
  1625 the indexing expression, $\Delta$ is the domain, a set of $n$-tuples
  1626 specified by the indexing expression which defines particular values
  1627 assigned to the dummy indices on performing the iterated operation,
  1628 $f(i_1,\dots,i_n)$ is the integrand, a logical expression whose
  1629 resultant value depends on the dummy indices.
  1630 
  1631 For $\forall$-quantification the resultant value of the iterated
  1632 logical expression is {\it true}, if the value of the integrand is
  1633 {\it true} for all $n$-tuples contained in the domain, otherwise
  1634 {\it false}.
  1635 
  1636 For $\exists$-quantification the resultant value of the iterated
  1637 logical expression is {\it false}, if the value of the integrand is
  1638 {\it false} for all $n$-tuples contained in the domain, otherwise
  1639 {\it true}.
  1640 
  1641 \subsubsection{Parenthesized expressions}
  1642 
  1643 Any logical expression may be enclosed in parentheses that
  1644 syntactically makes it a primary logical expression.
  1645 
  1646 Parentheses may be used in logical expressions, as in algebra, to
  1647 specify the desired order in which operations are to be performed.
  1648 Where parentheses are used, the expression within the parentheses is
  1649 evaluated before the resultant value is used.
  1650 
  1651 The resultant value of the parenthesized expression is the same as the
  1652 value of the expression enclosed within parentheses.
  1653 
  1654 \subsubsection{Logical operators}
  1655 
  1656 In MathProg there exist the following logical operators, which may be
  1657 used in logical expressions:
  1658 
  1659 \medskip
  1660 
  1661 \begin{tabular}{@{}p{96pt}p{222pt}@{}}
  1662 {\tt not} $x$, {\tt!}$x$&negation $\neg\ x$\\
  1663 $x$ {\tt and} $y$, $x$ {\tt\&\&} $y$&conjunction (logical ``and'')
  1664 $x\;\&\;y$\\
  1665 $x$ {\tt or} $y$, $x$ {\tt||} $y$&disjunction (logical ``or'')
  1666 $x\vee y$\\
  1667 \end{tabular}
  1668 
  1669 \medskip
  1670 
  1671 \noindent where $x$ and $y$ are logical expressions.
  1672 
  1673 If the expression includes more than one logical operator, all
  1674 operators are performed from left to right according to the hierarchy
  1675 of the operations (see below). The resultant value of the expression,
  1676 which contains logical operators, is the result of applying the
  1677 operators to their operands.
  1678 
  1679 \subsubsection{Hierarchy of operations}
  1680 
  1681 The following list shows the hierarchy of operations in logical
  1682 expressions:
  1683 
  1684 \medskip
  1685 
  1686 \noindent\hfil
  1687 \begin{tabular}{@{}ll@{}}
  1688 Operation&Hierarchy\\
  1689 \hline
  1690 Evaluation of numeric operations&1st-7th\\
  1691 Evaluation of symbolic operations&8th-9th\\
  1692 Evaluation of set operations&10th-14th\\
  1693 Relational operations ({\tt<}, {\tt<=}, etc.)&15th\\
  1694 Negation ({\tt not}, {\tt!})&16th\\
  1695 Conjunction ({\tt and}, {\tt\&\&})&17th\\
  1696 $\forall$- and $\exists$-quantification ({\tt forall}, {\tt exists})&
  1697 18th\\
  1698 Disjunction ({\tt or}, {\tt||})&19th\\
  1699 \end{tabular}
  1700 
  1701 \medskip
  1702 
  1703 This hierarchy has the same meaning as was explained above for numeric
  1704 expressions (see Subsection \ref{hierarchy}, page \pageref{hierarchy}).
  1705 
  1706 \subsection{Linear expressions}
  1707 
  1708 An {\it linear expression} is a rule for computing so called
  1709 a {\it linear form} or simply a {\it formula}, which is a linear (or
  1710 affine) function of elemental variables.
  1711 
  1712 The primary linear expression may be an unsubscripted variable,
  1713 subscripted variable, iterated linear expression, conditional linear
  1714 expression, or another linear expression enclosed in parentheses.
  1715 
  1716 It is also allowed to use a numeric expression as the primary linear
  1717 expression, in which case the resultant value of the numeric expression
  1718 is automatically converted to a formula that includes the constant term
  1719 only.
  1720 
  1721 \medskip
  1722 
  1723 \noindent{\bf Examples}
  1724 
  1725 \medskip
  1726 
  1727 \noindent
  1728 \begin{tabular}{@{}ll@{}}
  1729 \verb|z|&(unsubscripted variable)\\
  1730 \verb|x[i,j]|&(subscripted variable)\\
  1731 \verb|sum{j in J} (a[i] * x[i,j] + 3 * y)|&(iterated expression)\\
  1732 \verb|if i in I then x[i,j] else 1.5 * z + 3|&(conditional expression)\\
  1733 \verb|(a[i,j] * x[i,j] + y[i-1] + .1)|&(parenthesized expression)\\
  1734 \end{tabular}
  1735 
  1736 \medskip
  1737 
  1738 More general linear expressions containing two or more primary linear
  1739 expressions may be constructed by using certain arithmetic operators.
  1740 
  1741 \medskip
  1742 
  1743 \noindent{\bf Examples}
  1744 
  1745 \medskip
  1746 
  1747 \noindent\verb|2 * x[i-1,j+1] + 3.5 * y[k] + .5 * z|
  1748 
  1749 \noindent\verb|(- x[i,j] + 3.5 * y[k]) / sum{t in T} abs(d[i,j,t])|
  1750 
  1751 \subsubsection{Unsubscripted variables}
  1752 
  1753 If the primary linear expression is an unsubscripted variable (which
  1754 must be 0-dimensional), the resultant formula is that unsubscripted
  1755 variable.
  1756 
  1757 \subsubsection{Subscripted variables}
  1758 
  1759 The primary linear expression, which refers to a subscripted variable,
  1760 has the following syntactic form:
  1761 
  1762 \medskip
  1763 
  1764 \noindent\hfil
  1765 {\it name}{\tt[}$i_1${\tt,} $i_2${\tt,} \dots{\tt,} $i_n${\tt]}
  1766 
  1767 \medskip
  1768 
  1769 \noindent where {\it name} is the symbolic name of the model variable,
  1770 $i_1$, $i_2$, \dots, $i_n$ are subscripts.
  1771 
  1772 Each subscript must be a numeric or symbolic expression. The number of
  1773 subscripts in the subscript list must be the same as the dimension of
  1774 the model variable with which the subscript list is associated.
  1775 
  1776 Actual values of the subscript expressions are used to identify a
  1777 particular member of the model variable that determines the resultant
  1778 formula, which is an elemental variable associated with corresponding
  1779 member.
  1780 
  1781 \subsubsection{Iterated expressions}
  1782 
  1783 An {\it iterated linear expression} is a primary linear expression,
  1784 which has the following syntactic form:
  1785 
  1786 \medskip
  1787 
  1788 \noindent\hfil
  1789 {\tt sum} {\it indexing-expression} {\it integrand}
  1790 
  1791 \medskip
  1792 
  1793 \noindent where {\it indexing-expression} is an indexing expression,
  1794 which introduces dummy indices and controls iterating, {\it integrand}
  1795 is a linear expression that participates in the operation.
  1796 
  1797 The iterated linear expression is evaluated exactly in the same way as
  1798 the iterated numeric expression (see Subection \ref{itexpr}, page
  1799 \pageref{itexpr}) with exception that the integrand participated in the
  1800 summation is a formula, not a numeric value.
  1801 
  1802 \subsubsection{Conditional expressions}
  1803 
  1804 A {\it conditional linear expression} is a primary linear expression,
  1805 which has one of the following two syntactic forms:
  1806 
  1807 \medskip
  1808 
  1809 \noindent\hfil
  1810 {\tt if} $b$ {\tt then} $f$ {\tt else} $g$
  1811 
  1812 \medskip
  1813 
  1814 \noindent\hspace{127pt}
  1815 {\tt if} $b$ {\tt then} $f$
  1816 
  1817 \medskip
  1818 
  1819 \noindent where $b$ is an logical expression, $f$ and $g$ are linear
  1820 expressions.
  1821 
  1822 The conditional linear expression is evaluated exactly in the same way
  1823 as the conditional numeric expression (see Subsection \ref{ifthen},
  1824 page \pageref{ifthen}) with exception that operands participated in the
  1825 operation are formulae, not numeric values.
  1826 
  1827 \subsubsection{Parenthesized expressions}
  1828 
  1829 Any linear expression may be enclosed in parentheses that syntactically
  1830 makes it a primary linear expression.
  1831 
  1832 Parentheses may be used in linear expressions, as in algebra, to
  1833 specify the desired order in which operations are to be performed.
  1834 Where parentheses are used, the expression within the parentheses is
  1835 evaluated before the resultant formula is used.
  1836 
  1837 The resultant value of the parenthesized expression is the same as the
  1838 value of the expression enclosed within parentheses.
  1839 
  1840 \subsubsection{Arithmetic operators}
  1841 
  1842 In MathProg there exists the following arithmetic operators, which may
  1843 be used in linear expressions:
  1844 
  1845 \medskip
  1846 
  1847 \begin{tabular}{@{}p{96pt}p{222pt}@{}}
  1848 {\tt+} $f$&unary plus\\
  1849 {\tt-} $f$&unary minus\\
  1850 $f$ {\tt+} $g$&addition\\
  1851 $f$ {\tt-} $g$&subtraction\\
  1852 $x$ {\tt*} $f$, $f$ {\tt*} $x$&multiplication\\
  1853 $f$ {\tt/} $x$&division
  1854 \end{tabular}
  1855 
  1856 \medskip
  1857 
  1858 \noindent where $f$ and $g$ are linear expressions, $x$ is a numeric
  1859 expression (more precisely, a linear expression containing only the
  1860 constant term).
  1861 
  1862 If the expression includes more than one arithmetic operator, all
  1863 operators are performed from left to right according to the hierarchy
  1864 of operations (see below). The resultant value of the expression, which
  1865 contains arithmetic operators, is the result of applying the operators
  1866 to their operands.
  1867 
  1868 \subsubsection{Hierarchy of operations}
  1869 
  1870 The hierarchy of arithmetic operations used in linear expressions is
  1871 the same as for numeric expressions (see Subsection \ref{hierarchy},
  1872 page \pageref{hierarchy}).
  1873 
  1874 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1875 
  1876 \newpage
  1877 
  1878 \section{Statements}
  1879 
  1880 {\it Statements} are basic units of the model description. In MathProg
  1881 all statements are divided into two categories: declaration statements
  1882 and functional statements.
  1883 
  1884 {\it Declaration statements} (set statement, parameter statement,
  1885 variable statement, constraint statement, and objective statement) are
  1886 used to declare model objects of certain kinds and define certain
  1887 properties of such objects.
  1888 
  1889 {\it Functional statements} (solve statement, check statement, display
  1890 statement, printf statement, loop statement) are intended for
  1891 performing some specific actions.
  1892 
  1893 Note that declaration statements may follow in arbitrary order, which
  1894 does not affect the result of translation. However, any model object
  1895 must be declared before it is referenced in other statements.
  1896 
  1897 \subsection{Set statement}
  1898 
  1899 \medskip
  1900 
  1901 \framebox[345pt][l]{
  1902 \parbox[c][24pt]{345pt}{
  1903 \hspace{6pt} {\tt set} {\it name} {\it alias} {\it domain} {\tt,}
  1904 {\it attrib} {\tt,} \dots {\tt,} {\it attrib} {\tt;}
  1905 }}
  1906 
  1907 \setlength{\leftmargini}{60pt}
  1908 
  1909 \begin{description}
  1910 \item[{\rm Where:}\hspace*{23pt}] {\it name} is a symbolic name of the
  1911 set;
  1912 \item[\hspace*{54pt}] {\it alias} is an optional string literal, which
  1913 specifies an alias of the set;
  1914 \item[\hspace*{54pt}] {\it domain} is an optional indexing expression,
  1915 which specifies a subscript domain of the set;
  1916 \item[\hspace*{54pt}] {\it attrib}, \dots, {\it attrib} are optional
  1917 attributes of the set. (Commae preceding attributes may be omitted.)
  1918 \end{description}
  1919 
  1920 \noindent Optional attributes:
  1921 
  1922 \begin{description}
  1923 \item[{\tt dimen} $n$\hspace*{19pt}] specifies the dimension of
  1924 $n$-tuples, which the set consists of;
  1925 \item[{\tt within} {\it expression}]\hspace*{0pt}\\
  1926 specifies a superset which restricts the set or all its members
  1927 (elemental sets) to be within that superset;
  1928 \item[{\tt:=} {\it expression}]\hspace*{0pt}\\
  1929 specifies an elemental set assigned to the set or its members;
  1930 \item[{\tt default} {\it expression}]\hspace*{0pt}\\
  1931 specifies an elemental set assigned to the set or its members whenever
  1932 no appropriate data are available in the data section.
  1933 \end{description}
  1934 
  1935 \newpage
  1936 
  1937 \noindent{\bf Examples}
  1938 
  1939 \begin{verbatim}
  1940 set V;
  1941 set E within V cross V;
  1942 set step{s in 1..maxiter} dimen 2 := if s = 1 then E else
  1943    step[s-1] union setof{k in V, (i,k) in step[s-1], (k,j)
  1944    in step[s-1]}(i,j);
  1945 set A{i in I, j in J}, within B[i+1] cross C[j-1], within
  1946    D diff E, default {('abc',123), (321,'cba')};
  1947 \end{verbatim}
  1948 
  1949 The set statement declares a set. If the subscript domain is not
  1950 specified, the set is a simple set, otherwise it is an array of
  1951 elemental sets.
  1952 
  1953 The {\tt dimen} attribute specifies the dimension of $n$-tuples, which
  1954 the set (if it is a simple set) or its members (if the set is an array
  1955 of elemental sets) consist of, where $n$ must be unsigned integer from
  1956 1 to 20. At most one {\tt dimen} attribute can be specified. If the
  1957 {\tt dimen} attribute is not specified, the dimension of\linebreak
  1958 $n$-tuples is implicitly determined by other attributes (for example,
  1959 if there is a set expression that follows {\tt:=} or the keyword
  1960 {\tt default}, the dimension of $n$-tuples of corresponding elemental
  1961 set is used). If no dimension information is available, {\tt dimen 1}
  1962 is assumed.
  1963 
  1964 The {\tt within} attribute specifies a set expression whose resultant
  1965 value is a superset used to restrict the set (if it is a simple set) or
  1966 its members (if the set is an array of elemental sets) to be within
  1967 that superset. Arbitrary number of {\tt within} attributes may be
  1968 specified in the same set statement.
  1969 
  1970 The assign ({\tt:=}) attribute specifies a set expression used to
  1971 evaluate elemental set(s) assigned to the set (if it is a simple set)
  1972 or its members (if the set is an array of elemental sets). If the
  1973 assign attribute is specified, the set is {\it computable} and
  1974 therefore needs no data to be provided in the data section. If the
  1975 assign attribute is not specified, the set must be provided with data
  1976 in the data section. At most one assign or default attribute can be
  1977 specified for the same set.
  1978 
  1979 The {\tt default} attribute specifies a set expression used to evaluate
  1980 elemental set(s) assigned to the set (if it is a simple set) or its
  1981 members (if the set is an array of elemental sets) whenever
  1982 no appropriate data are available in the data section. If neither
  1983 assign nor default attribute is specified, missing data will cause an
  1984 error.
  1985 
  1986 \subsection{Parameter statement}
  1987 
  1988 \medskip
  1989 
  1990 \framebox[345pt][l]{
  1991 \parbox[c][24pt]{345pt}{
  1992 \hspace{6pt} {\tt param} {\it name} {\it alias} {\it domain} {\tt,}
  1993 {\it attrib} {\tt,} \dots {\tt,} {\it attrib} {\tt;}
  1994 }}
  1995 
  1996 \setlength{\leftmargini}{60pt}
  1997 
  1998 \begin{description}
  1999 \item[{\rm Where:}\hspace*{23pt}] {\it name} is a symbolic name of the
  2000 parameter;
  2001 \item[\hspace*{54pt}] {\it alias} is an optional string literal, which
  2002 specifies an alias of the parameter;
  2003 \item[\hspace*{54pt}] {\it domain} is an optional indexing expression,
  2004 which specifies a subscript domain of the parameter;
  2005 \item[\hspace*{54pt}] {\it attrib}, \dots, {\it attrib} are optional
  2006 attributes of the parameter. (Commae preceding attributes may be
  2007 omitted.)
  2008 \end{description}
  2009 
  2010 \noindent Optional attributes:
  2011 
  2012 \begin{description}
  2013 \item[{\tt integer}\hspace*{18.5pt}] specifies that the parameter is
  2014 integer;
  2015 \item[{\tt binary}\hspace*{24pt}] specifies that the parameter is
  2016 binary;
  2017 \item[{\tt symbolic}\hspace*{13.5pt}] specifies that the parameter is
  2018 symbolic;
  2019 \item[{\it relation expression}]\hspace*{0pt}\\
  2020 (where {\it relation} is one of: {\tt<}, {\tt<=}, {\tt=}, {\tt==},
  2021 {\tt>=}, {\tt>}, {\tt<>}, {\tt!=})\\
  2022 specifies a condition that restricts the parameter or its members to
  2023 satisfy that condition;
  2024 \item[{\tt in} {\it expression}]\hspace*{0pt}\\
  2025 specifies a superset that restricts the parameter or its members to be
  2026 in that superset;
  2027 \item[{\tt:=} {\it expression}]\hspace*{0pt}\\
  2028 specifies a value assigned to the parameter or its members;
  2029 \item[{\tt default} {\it expression}]\hspace*{0pt}\\
  2030 specifies a value assigned to the parameter or its members whenever
  2031 no appropriate data are available in the data section.
  2032 \end{description}
  2033 
  2034 \noindent{\bf Examples}
  2035 
  2036 \begin{verbatim}
  2037 param units{raw, prd} >= 0;
  2038 param profit{prd, 1..T+1};
  2039 param N := 20, integer, >= 0, <= 100;
  2040 param comb 'n choose k' {n in 0..N, k in 0..n} :=
  2041    if k = 0 or k = n then 1 else comb[n-1,k-1] + comb[n-1,k];
  2042 param p{i in I, j in J}, integer, >= 0, <= i+j,
  2043    in A[i] symdiff B[j], in C[i,j], default 0.5 * (i + j);
  2044 param month symbolic default 'May' in {'Mar', 'Apr', 'May'};
  2045 \end{verbatim}
  2046 
  2047 The parameter statement declares a parameter. If a subscript domain is
  2048 not specified, the parameter is a simple (scalar) parameter, otherwise
  2049 it is a $n$-dimensional array.
  2050 
  2051 The type attributes {\tt integer}, {\tt binary}, and {\tt symbolic}
  2052 qualify the type of values that can be assigned to the parameter as
  2053 shown below:
  2054 
  2055 \medskip
  2056 
  2057 \noindent\hfil
  2058 \begin{tabular}{@{}ll@{}}
  2059 Type attribute&Assigned values\\
  2060 \hline
  2061 (not specified)&Any numeric values\\
  2062 {\tt integer}&Only integer numeric values\\
  2063 {\tt binary}&Either 0 or 1\\
  2064 {\tt symbolic}&Any numeric and symbolic values\\
  2065 \end{tabular}
  2066 
  2067 \newpage
  2068 
  2069 The {\tt symbolic} attribute cannot be specified along with other type
  2070 attributes. Being specified it must precede all other attributes.
  2071 
  2072 The condition attribute specifies an optional condition that restricts
  2073 values assigned to the parameter to satisfy that condition. This
  2074 attribute has the following syntactic forms:
  2075 
  2076 \medskip
  2077 
  2078 \begin{tabular}{@{}ll@{}}
  2079 {\tt<} $v$&check for $x<v$\\
  2080 {\tt<=} $v$&check for $x\leq v$\\
  2081 {\tt=} $v$, {\tt==} $v$&check for $x=v$\\
  2082 {\tt>=} $v$&check for $x\geq v$\\
  2083 {\tt>} $v$&check for $x\geq v$\\
  2084 {\tt<>} $v$, {\tt!=} $v$&check for $x\neq v$\\
  2085 \end{tabular}
  2086 
  2087 \medskip
  2088 
  2089 \noindent where $x$ is a value assigned to the parameter, $v$ is the
  2090 resultant value of a numeric or symbolic expression specified in the
  2091 condition attribute. Arbitrary number of condition attributes can be
  2092 specified for the same parameter. If a value being assigned to the
  2093 parameter during model evaluation violates at least one of specified
  2094 conditions, an error is raised. (Note that symbolic values are ordered
  2095 lexicographically, and any numeric value precedes any symbolic value.)
  2096 
  2097 The {\tt in} attribute is similar to the condition attribute and
  2098 specifies a set expression whose resultant value is a superset used to
  2099 restrict numeric or symbolic values assigned to the parameter to be in
  2100 that superset. Arbitrary number of the {\tt in} attributes can be
  2101 specified for the same parameter. If a value being assigned to the
  2102 parameter during model evaluation is not in at least one of specified
  2103 supersets, an error is raised.
  2104 
  2105 The assign ({\tt:=}) attribute specifies a numeric or symbolic
  2106 expression used to compute a value assigned to the parameter (if it is
  2107 a simple parameter) or its member (if the parameter is an array). If
  2108 the assign attribute is specified, the parameter is {\it computable}
  2109 and therefore needs no data to be provided in the data section. If the
  2110 assign attribute is not specified, the parameter must be provided with
  2111 data in the data section. At most one assign or {\tt default} attribute
  2112 can be specified for the same parameter.
  2113 
  2114 The {\tt default} attribute specifies a numeric or symbolic expression
  2115 used to compute a value assigned to the parameter or its member
  2116 whenever no appropriate data are available in the data section. If
  2117 neither assign nor {\tt default} attribute is specified, missing data
  2118 will cause an error.
  2119 
  2120 \subsection{Variable statement}
  2121 
  2122 \medskip
  2123 
  2124 \framebox[345pt][l]{
  2125 \parbox[c][24pt]{345pt}{
  2126 \hspace{6pt} {\tt var} {\it name} {\it alias} {\it domain} {\tt,}
  2127 {\it attrib} {\tt,} \dots {\tt,} {\it attrib} {\tt;}
  2128 }}
  2129 
  2130 \setlength{\leftmargini}{60pt}
  2131 
  2132 \begin{description}
  2133 \item[{\rm Where:}\hspace*{23pt}] {\it name} is a symbolic name of the
  2134 variable;
  2135 \item[\hspace*{54pt}] {\it alias} is an optional string literal, which
  2136 specifies an alias of the variable;
  2137 \item[\hspace*{54pt}] {\it domain} is an optional indexing expression,
  2138 which specifies a subscript domain of the variable;
  2139 \item[\hspace*{54pt}] {\it attrib}, \dots, {\it attrib} are optional
  2140 attributes of the variable. (Commae preceding attributes may be
  2141 omitted.)
  2142 \end{description}
  2143 
  2144 \noindent Optional attributes:
  2145 
  2146 \begin{description}
  2147 \item[{\tt integer}\hspace*{18.5pt}] restricts the variable to be
  2148 integer;
  2149 \item[{\tt binary}\hspace*{24pt}] restricts the variable to be binary;
  2150 \item[{\tt>=} {\it expression}]\hspace*{0pt}\\
  2151 specifies an lower bound of the variable;
  2152 \item[{\tt<=} {\it expression}]\hspace*{0pt}\\
  2153 specifies an upper bound of the variable;
  2154 \item[{\tt=} {\it expression}]\hspace*{0pt}\\
  2155 specifies a fixed value of the variable;
  2156 \end{description}
  2157 
  2158 \noindent{\bf Examples}
  2159 
  2160 \begin{verbatim}
  2161 var x >= 0;
  2162 var y{I,J};
  2163 var make{p in prd}, integer, >= commit[p], <= market[p];
  2164 var store{raw, 1..T+1} >= 0;
  2165 var z{i in I, j in J} >= i+j;
  2166 \end{verbatim}
  2167 
  2168 The variable statement declares a variable. If a subscript domain is
  2169 not specified, the variable is a simple (scalar) variable, otherwise it
  2170 is a $n$-dimensional array of elemental variables.
  2171 
  2172 Elemental variable(s) associated with the model variable (if it is a
  2173 simple variable) or its members (if it is an array) correspond to the
  2174 variables in the LP/MIP problem formulation (see Subsection
  2175 \ref{problem}, page \pageref{problem}). Note that only elemental
  2176 variables actually referenced in some constraints and/or objectives are
  2177 included in the LP/MIP problem instance to be generated.
  2178 
  2179 The type attributes {\tt integer} and {\tt binary} restrict the
  2180 variable to be integer or binary, respectively. If no type attribute is
  2181 specified, the variable is continuous. If all variables in the model
  2182 are continuous, the corresponding problem is of LP class. If there is
  2183 at least one integer or binary variable, the problem is of MIP class.
  2184 
  2185 The lower bound ({\tt>=}) attribute specifies a numeric expression for
  2186 computing an lower bound of the variable. At most one lower bound can
  2187 be specified. By default all variables (except binary ones) have no
  2188 lower bound, so if a variable is required to be non-negative, its zero
  2189 lower bound should be explicitly specified.
  2190 
  2191 The upper bound ({\tt<=}) attribute specifies a numeric expression for
  2192 computing an upper bound of the variable. At most one upper bound
  2193 attribute can be specified.
  2194 
  2195 The fixed value ({\tt=}) attribute specifies a numeric expression for
  2196 computing a value, at which the variable is fixed. This attribute
  2197 cannot be specified along with the bound attributes.
  2198 
  2199 \subsection{Constraint statement}
  2200 
  2201 \medskip
  2202 
  2203 \framebox[345pt][l]{
  2204 \parbox[c][96pt]{345pt}{
  2205 \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:}
  2206 {\it expression} {\tt,} {\tt=} {\it expression} {\tt;}
  2207 
  2208 \medskip
  2209 
  2210 \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:}
  2211 {\it expression} {\tt,} {\tt<=} {\it expression} {\tt;}
  2212 
  2213 \medskip
  2214 
  2215 \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:}
  2216 {\it expression} {\tt,} {\tt>=} {\it expression} {\tt;}
  2217 
  2218 \medskip
  2219 
  2220 \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:}
  2221 {\it expression} {\tt,} {\tt<=} {\it expression} {\tt,} {\tt<=}
  2222 {\it expression} {\tt;}
  2223 
  2224 \medskip
  2225 
  2226 \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:}
  2227 {\it expression} {\tt,} {\tt>=} {\it expression} {\tt,} {\tt>=}
  2228 {\it expression} {\tt;}
  2229 }}
  2230 
  2231 \setlength{\leftmargini}{60pt}
  2232 
  2233 \begin{description}
  2234 \item[{\rm Where:}\hspace*{23pt}] {\it name} is a symbolic name of the
  2235 constraint;
  2236 \item[\hspace*{54pt}] {\it alias} is an optional string literal, which
  2237 specifies an alias of the constraint;
  2238 \item[\hspace*{54pt}] {\it domain} is an optional indexing expression,
  2239 which specifies a subscript domain of the constraint;
  2240 \item[\hspace*{54pt}] {\it expression} is a linear expression used to
  2241 compute a component of the constraint. (Commae following expressions
  2242 may be omitted.)
  2243 \end{description}
  2244 
  2245 \begin{description}
  2246 \item[{\rm Note:}\hspace*{31pt}] The keyword {\tt s.t.} may be written
  2247 as {\tt subject to} or as {\tt subj to}, or may be omitted at all.
  2248 \end{description}
  2249 
  2250 \noindent{\bf Examples}
  2251 
  2252 \begin{verbatim}
  2253 s.t. r: x + y + z, >= 0, <= 1;
  2254 limit{t in 1..T}: sum{j in prd} make[j,t] <= max_prd;
  2255 subject to balance{i in raw, t in 1..T}: store[i,t+1] -
  2256    store[i,t] - sum{j in prd} units[i,j] * make[j,t];
  2257 subject to rlim 'regular-time limit' {t in time}:
  2258 sum{p in prd} pt[p] * rprd[p,t] <= 1.3 * dpp[t] * crews[t];
  2259 \end{verbatim}
  2260 
  2261 The constraint statement declares a constraint. If a subscript domain
  2262 is not specified, the constraint is a simple (scalar) constraint,
  2263 otherwise it is a $n$-dimensional array of elemental constraints.
  2264 
  2265 Elemental constraint(s) associated with the model constraint (if it is
  2266 a simple constraint) or its members (if it is an array) correspond to
  2267 the linear constraints in the LP/MIP problem formulation (see
  2268 Subsection \ref{problem}, page \pageref{problem}).
  2269 
  2270 If the constraint has the form of equality or single inequality, i.e.
  2271 includes two expressions, one of which follows the colon and other
  2272 follows the relation sign {\tt=}, {\tt<=}, or {\tt>=}, both expressions
  2273 in the statement can be linear expressions. If the constraint has the
  2274 form of double inequality, i.e. includes three expressions, the middle
  2275 expression can be a linear expression while the leftmost and rightmost
  2276 ones can be only numeric expressions.
  2277 
  2278 Generating the model is, roughly speaking, generating its constraints,
  2279 which are always evaluated for the entire subscript domain. Evaluation
  2280 of the constraints leads, in turn, to evaluation of other model objects
  2281 such as sets, parameters, and variables.
  2282 
  2283 Constructing an actual linear constraint included in the problem
  2284 instance, which (constraint) corresponds to a particular elemental
  2285 constraint, is performed as follows.
  2286 
  2287 If the constraint has the form of equality or single inequality,
  2288 evaluation of both linear expressions gives two resultant linear forms:
  2289 $$\begin{array}{r@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r}
  2290 f&=&a_1x_1&+&a_2x_2&+\dots+&a_nx_n&+&a_0,\\
  2291 g&=&b_1x_1&+&a_2x_2&+\dots+&a_nx_n&+&b_0,\\
  2292 \end{array}$$
  2293 where $x_1$, $x_2$, \dots, $x_n$ are elemental variables; $a_1$, $a_2$,
  2294 \dots, $a_n$, $b_1$, $b_2$, \dots, $b_n$ are numeric coefficients;
  2295 $a_0$ and $b_0$ are constant terms. Then all linear terms of $f$ and
  2296 $g$ are carried to the left-hand side, and the constant terms are
  2297 carried to the right-hand side, that gives the final elemental
  2298 constraint in the standard form:
  2299 $$(a_1-b_1)x_1+(a_2-b_2)x_2+\dots+(a_n-b_n)x_n\left\{
  2300 \begin{array}{@{}c@{}}=\\\leq\\\geq\\\end{array}\right\}b_0-a_0.$$
  2301 
  2302 If the constraint has the form of double inequality, evaluation of the
  2303 middle linear expression gives the resultant linear form:
  2304 $$f=a_1x_1+a_2x_2+\dots+a_nx_n+a_0,$$
  2305 and evaluation of the leftmost and rightmost numeric expressions gives
  2306 two numeric values $l$ and $u$, respectively. Then the constant term of
  2307 the linear form is carried to both left-hand and right-handsides that
  2308 gives the final elemental constraint in the standard form:
  2309 $$l-a_0\leq a_1x_1+a_2x_2+\dots+a_nx_n\leq u-a_0.$$
  2310 
  2311 \subsection{Objective statement}
  2312 
  2313 \medskip
  2314 
  2315 \framebox[345pt][l]{
  2316 \parbox[c][44pt]{345pt}{
  2317 \hspace{6pt} {\tt minimize} {\it name} {\it alias} {\it domain} {\tt:}
  2318 {\it expression} {\tt;}
  2319 
  2320 \medskip
  2321 
  2322 \hspace{6pt} {\tt maximize} {\it name} {\it alias} {\it domain} {\tt:}
  2323 {\it expression} {\tt;}
  2324 }}
  2325 
  2326 \setlength{\leftmargini}{60pt}
  2327 
  2328 \begin{description}
  2329 \item[{\rm Where:}\hspace*{23pt}] {\it name} is a symbolic name of the
  2330 objective;
  2331 \item[\hspace*{54pt}] {\it alias} is an optional string literal, which
  2332 specifies an alias of the objective;
  2333 \item[\hspace*{54pt}] {\it domain} is an optional indexing expression,
  2334 which specifies a subscript domain of the objective;
  2335 \item[\hspace*{54pt}] {\it expression} is a linear expression used to
  2336 compute the linear form of the objective.
  2337 \end{description}
  2338 
  2339 \noindent{\bf Examples}
  2340 
  2341 \begin{verbatim}
  2342 minimize obj: x + 1.5 * (y + z);
  2343 maximize total_profit: sum{p in prd} profit[p] * make[p];
  2344 \end{verbatim}
  2345 
  2346 The objective statement declares an objective. If a subscript domain is
  2347 not specified, the objective is a simple (scalar) objective. Otherwise
  2348 it is a $n$-dimensional array of elemental objectives.
  2349 
  2350 Elemental objective(s) associated with the model objective (if it is a
  2351 simple objective) or its members (if it is an array) correspond to
  2352 general linear constraints in the LP/MIP problem formulation (see
  2353 Subsection \ref{problem}, page \pageref{problem}). However, unlike
  2354 constraints the corresponding linear forms are free (unbounded).
  2355 
  2356 Constructing an actual linear constraint included in the problem
  2357 instance, which (constraint) corresponds to a particular elemental
  2358 constraint, is performed as follows. The linear expression specified in
  2359 the objective statement is evaluated that, gives the resultant linear
  2360 form:
  2361 $$f=a_1x_1+a_2x_2+\dots+a_nx_n+a_0,$$
  2362 where $x_1$, $x_2$, \dots, $x_n$ are elemental variables; $a_1$, $a_2$,
  2363 \dots, $a_n$ are numeric coefficients; $a_0$ is the constant term. Then
  2364 the linear form is used to construct the final elemental constraint in
  2365 the standard form:
  2366 $$-\infty<a_1x_1+a_2x_2+\dots+a_nx_n+a_0<+\infty.$$
  2367 
  2368 As a rule the model description contains only one objective statement
  2369 that defines the objective function used in the problem instance.
  2370 However, it is allowed to declare arbitrary number of objectives, in
  2371 which case the actual objective function is the first objective
  2372 encountered in the model description. Other objectives are also
  2373 included in the problem instance, but they do not affect the objective
  2374 function.
  2375 
  2376 \subsection{Solve statement}
  2377 
  2378 \medskip
  2379 
  2380 \framebox[345pt][l]{
  2381 \parbox[c][24pt]{345pt}{
  2382 \hspace{6pt} {\tt solve} {\tt;}
  2383 }}
  2384 
  2385 \setlength{\leftmargini}{60pt}
  2386 
  2387 \begin{description}
  2388 \item[{\rm Note:}\hspace*{31pt}] The solve statement is optional and
  2389 can be used only once. If no solve statement is used, one is assumed at
  2390 the end of the model section.
  2391 \end{description}
  2392 
  2393 The solve statement causes the model to be solved, that means computing
  2394 numeric values of all model variables. This allows using variables in
  2395 statements below the solve statement in the same way as if they were
  2396 numeric parameters.
  2397 
  2398 Note that the variable, constraint, and objective statements cannot be
  2399 used below the solve statement, i.e. all principal components of the
  2400 model must be declared above the solve statement.
  2401 
  2402 \subsection{Check statement}
  2403 
  2404 \medskip
  2405 
  2406 \framebox[345pt][l]{
  2407 \parbox[c][24pt]{345pt}{
  2408 \hspace{6pt} {\tt check} {\it domain} {\tt:} {\it expression} {\tt;}
  2409 }}
  2410 
  2411 \setlength{\leftmargini}{60pt}
  2412 
  2413 \begin{description}
  2414 \item[{\rm Where:}\hspace*{23pt}] {\it domain} is an optional indexing
  2415 expression, which specifies a subscript domain of the check statement;
  2416 \item[\hspace*{54pt}] {\it expression} is an logical expression which
  2417 specifies the logical condition to be checked. (The colon preceding
  2418 {\it expression} may be omitted.)
  2419 \end{description}
  2420 
  2421 \noindent{\bf Examples}
  2422 
  2423 \begin{verbatim}
  2424 check: x + y <= 1 and x >= 0 and y >= 0;
  2425 check sum{i in ORIG} supply[i] = sum{j in DEST} demand[j];
  2426 check{i in I, j in 1..10}: S[i,j] in U[i] union V[j];
  2427 \end{verbatim}
  2428 
  2429 The check statement allows checking the resultant value of an logical
  2430 expression specified in the statement. If the value is {\it false}, an
  2431 error is reported.
  2432 
  2433 If the subscript domain is not specified, the check is performed only
  2434 once. Specifying the subscript domain allows performing multiple checks
  2435 for every\linebreak $n$-tuple in the domain set. In the latter case the
  2436 logical expression may include dummy indices introduced in
  2437 corresponding indexing expression.
  2438 
  2439 \subsection{Display statement}
  2440 
  2441 \medskip
  2442 
  2443 \framebox[345pt][l]{
  2444 \parbox[c][24pt]{345pt}{
  2445 \hspace{6pt} {\tt display} {\it domain} {\tt:} {\it item} {\tt,}
  2446 \dots {\tt,} {\it item} {\tt;}
  2447 }}
  2448 
  2449 \setlength{\leftmargini}{60pt}
  2450 
  2451 \begin{description}
  2452 \item[{\rm Where:}\hspace*{23pt}] {\it domain} is an optional indexing
  2453 expression, which specifies a subscript domain of the check statement;
  2454 \item[\hspace*{54pt}] {\it item}, \dots, {\it item} are items to be
  2455 displayed. (The colon preceding the first item may be omitted.)
  2456 \end{description}
  2457 
  2458 \noindent{\bf Examples}
  2459 
  2460 \begin{verbatim}
  2461 display: 'x =', x, 'y =', y, 'z =', z;
  2462 display sqrt(x ** 2 + y ** 2 + z ** 2);
  2463 display{i in I, j in J}: i, j, a[i,j], b[i,j];
  2464 \end{verbatim}
  2465 
  2466 \newpage
  2467 
  2468 The display statement evaluates all items specified in the statement
  2469 and writes their values to the terminal in plain text format.
  2470 
  2471 If a subscript domain is not specified, items are evaluated and then
  2472 displayed only once. Specifying the subscript domain causes items to be
  2473 evaluated and displayed for every $n$-tuple in the domain set. In the
  2474 latter case items may include dummy indices introduced in corresponding
  2475 indexing expression.
  2476 
  2477 An item to be displayed can be a model object (set, parameter, variable,
  2478 constraint, objective) or an expression.
  2479 
  2480 If the item is a computable object (i.e. a set or parameter provided
  2481 with the assign attribute), the object is evaluated over the entire
  2482 domain and then its content (i.e. the content of the object array) is
  2483 displayed. Otherwise, if the item is not a computable object, only its
  2484 current content (i.e. members actually generated during the model
  2485 evaluation) is displayed.
  2486 
  2487 If the item is an expression, the expression is evaluated and its
  2488 resultant value is displayed.
  2489 
  2490 \subsection{Printf statement}
  2491 
  2492 \medskip
  2493 
  2494 \framebox[345pt][l]{
  2495 \parbox[c][60pt]{345pt}{
  2496 \hspace{6pt} {\tt printf} {\it domain} {\tt:} {\it format} {\tt,}
  2497 {\it expression} {\tt,} \dots {\tt,} {\it expression} {\tt;}
  2498 
  2499 \medskip
  2500 
  2501 \hspace{6pt} {\tt printf} {\it domain} {\tt:} {\it format} {\tt,}
  2502 {\it expression} {\tt,} \dots {\tt,} {\it expression} {\tt>}
  2503 {\it filename} {\tt;}
  2504 
  2505 \medskip
  2506 
  2507 \hspace{6pt} {\tt printf} {\it domain} {\tt:} {\it format} {\tt,}
  2508 {\it expression} {\tt,} \dots {\tt,} {\it expression} {\tt>>}
  2509 {\it filename} {\tt;}
  2510 }}
  2511 
  2512 \setlength{\leftmargini}{60pt}
  2513 
  2514 \begin{description}
  2515 \item[{\rm Where:}\hspace*{23pt}] {\it domain} is an optional indexing
  2516 expression, which specifies a subscript domain of the printf statement;
  2517 \item[\hspace*{54pt}] {\it format} is a symbolic expression whose value
  2518 specifies a format control string. (The colon preceding the format
  2519 expression may be omitted.)
  2520 \item[\hspace*{54pt}] {\it expression}, \dots, {\it expression} are
  2521 zero or more expressions whose values have to be formatted and printed.
  2522 Each expression must be of numeric, symbolic, or logical type.
  2523 \item[\hspace*{54pt}] {\it filename} is a symbolic expression whose
  2524 value specifies a name of a text file, to which the output is
  2525 redirected. The flag {\tt>} means creating a new empty file while the
  2526 flag {\tt>>} means appending the output to an existing file. If no file
  2527 name is specified, the output is written to the terminal.
  2528 \end{description}
  2529 
  2530 \noindent{\bf Examples}
  2531 
  2532 \begin{verbatim}
  2533 printf 'Hello, world!\n';
  2534 printf: "x = %.3f; y = %.3f; z = %.3f\n",
  2535    x, y, z > "result.txt";
  2536 printf{i in I, j in J}: "flow from %s to %s is %d\n",
  2537    i, j, x[i,j] >> result_file & ".txt";
  2538 \end{verbatim}
  2539 
  2540 \newpage
  2541 
  2542 \begin{verbatim}
  2543 printf{i in I} 'total flow from %s is %g\n',
  2544    i, sum{j in J} x[i,j];
  2545 printf{k in K} "x[%s] = " & (if x[k] < 0 then "?" else "%g"),
  2546    k, x[k];
  2547 \end{verbatim}
  2548 
  2549 The printf statement is similar to the display statement, however, it
  2550 allows formatting data to be written.
  2551 
  2552 If a subscript domain is not specified, the printf statement is
  2553 executed only once. Specifying a subscript domain causes executing the
  2554 printf statement for every $n$-tuple in the domain set. In the latter
  2555 case the format and expression may include dummy indices introduced in
  2556 corresponding indexing expression.
  2557 
  2558 The format control string is a value of the symbolic expression
  2559 {\it format} specified in the printf statement. It is composed of zero
  2560 or more directives as follows: ordinary characters (not {\tt\%}), which
  2561 are copied unchanged to the output stream, and conversion
  2562 specifications, each of which causes evaluating corresponding
  2563 expression specified in the printf statement, formatting it, and
  2564 writing its resultant value to the output stream.
  2565 
  2566 Conversion specifications that may be used in the format control string
  2567 are the following: {\tt d}, {\tt i}, {\tt f}, {\tt F}, {\tt e}, {\tt E},
  2568 {\tt g}, {\tt G}, and {\tt s}. These specifications have the same
  2569 syntax and semantics as in the C programming language.
  2570 
  2571 \subsection{For statement}
  2572 
  2573 \medskip
  2574 
  2575 \framebox[345pt][l]{
  2576 \parbox[c][44pt]{345pt}{
  2577 \hspace{6pt} {\tt for} {\it domain} {\tt:} {\it statement} {\tt;}
  2578 
  2579 \medskip
  2580 
  2581 \hspace{6pt} {\tt for} {\it domain} {\tt:} {\tt\{} {\it statement}
  2582 \dots {\it statement} {\tt\}} {\tt;}
  2583 }}
  2584 
  2585 \setlength{\leftmargini}{60pt}
  2586 
  2587 \begin{description}
  2588 \item[{\rm Where:}\hspace*{23pt}] {\it domain} is an indexing
  2589 expression which specifies a subscript domain of the for statement.
  2590 (The colon following the indexing expression may be omitted.)
  2591 \item[\hspace*{54pt}] {\it statement} is a statement, which should be
  2592 executed under control of the for statement;
  2593 \item[\hspace*{54pt}] {\it statement}, \dots, {\it statement} is a
  2594 sequence of statements (enclosed in curly braces), which should be
  2595 executed under control of the for statement.
  2596 \end{description}
  2597 
  2598 \begin{description}
  2599 \item[{\rm Note:}\hspace*{31pt}] Only the following statements can be
  2600 used within the for statement: check, display, printf, and another for.
  2601 \end{description}
  2602 
  2603 \noindent{\bf Examples}
  2604 
  2605 \begin{verbatim}
  2606 for {(i,j) in E: i != j}
  2607 {  printf "flow from %s to %s is %g\n", i, j, x[i,j];
  2608    check x[i,j] >= 0;
  2609 }
  2610 \end{verbatim}
  2611 
  2612 \newpage
  2613 
  2614 \begin{verbatim}
  2615 for {i in 1..n}
  2616 {  for {j in 1..n} printf " %s", if x[i,j] then "Q" else ".";
  2617    printf("\n");
  2618 }
  2619 for {1..72} printf("*");
  2620 \end{verbatim}
  2621 
  2622 The for statement causes a statement or a sequence of statements
  2623 specified as part of the for statement to be executed for every
  2624 $n$-tuple in the domain set. Thus, statements within the for statement
  2625 may include dummy indices introduced in corresponding indexing
  2626 expression.
  2627 
  2628 \subsection{Table statement}
  2629 
  2630 \medskip
  2631 
  2632 \framebox[345pt][l]{
  2633 \parbox[c][68pt]{345pt}{
  2634 \hspace{6pt} {\tt table} {\it name} {\it alias} {\tt IN} {\it driver}
  2635 {\it arg} \dots {\it arg} {\tt:}
  2636 
  2637 \hspace{6pt} {\tt\ \ \ \ \ } {\it set} {\tt<-} {\tt[} {\it fld} {\tt,}
  2638 \dots {\tt,} {\it fld} {\tt]} {\tt,} {\it par} {\tt\textasciitilde}
  2639 {\it fld} {\tt,} \dots {\tt,} {\it par} {\tt\textasciitilde} {\it fld}
  2640 {\tt;}
  2641 
  2642 \medskip
  2643 
  2644 \hspace{6pt} {\tt table} {\it name} {\it alias} {\it domain} {\tt OUT}
  2645 {\it driver} {\it arg} \dots {\it arg} {\tt:}
  2646 
  2647 \hspace{6pt} {\tt\ \ \ \ \ } {\it expr} {\tt\textasciitilde} {\it fld}
  2648 {\tt,} \dots {\tt,} {\it expr} {\tt\textasciitilde} {\it fld} {\tt;}
  2649 }}
  2650 
  2651 \setlength{\leftmargini}{60pt}
  2652 
  2653 \begin{description}
  2654 \item[{\rm Where:}\hspace*{23pt}] {\it name} is a symbolic name of the
  2655 table;
  2656 \item[\hspace*{54pt}] {\it alias} is an optional string literal, which
  2657 specifies an alias of the table;
  2658 \item[\hspace*{54pt}] {\it domain} is an indexing expression, which
  2659 specifies a subscript domain of the (output) table;
  2660 \item[\hspace*{54pt}] {\tt IN} means reading data from the input table;
  2661 \item[\hspace*{54pt}] {\tt OUT} means writing data to the output table;
  2662 \item[\hspace*{54pt}] {\it driver} is a symbolic expression, which
  2663 specifies the driver used to access the table (for details see Section
  2664 \ref{drivers}, page \pageref{drivers});
  2665 \item[\hspace*{54pt}] {\it arg} is an optional symbolic expression,
  2666 which is an argument pass\-ed to the table driver. This symbolic
  2667 expression must not include dummy indices specified in the domain;
  2668 \item[\hspace*{54pt}] {\it set} is the name of an optional simple set
  2669 called {\it control set}. It can be omitted along with the delimiter
  2670 {\tt<-};
  2671 \item[\hspace*{54pt}] {\it fld} is a field name. Within square brackets
  2672 at least one field should be specified. The field name following
  2673 a parameter name or expression is optional and can be omitted along
  2674 with the delimiter {\tt\textasciitilde}, in which case the name of
  2675 corresponding model object is used as the field name;
  2676 \item[\hspace*{54pt}] {\it par} is a symbolic name of a model parameter;
  2677 \item[\hspace*{54pt}] {\it expr} is a numeric or symbolic expression.
  2678 \end{description}
  2679 
  2680 \newpage
  2681 
  2682 \noindent{\bf Examples}
  2683 
  2684 \begin{verbatim}
  2685 table data IN "CSV" "data.csv":
  2686    S <- [FROM,TO], d~DISTANCE, c~COST;
  2687 table result{(f,t) in S} OUT "CSV" "result.csv":
  2688    f~FROM, t~TO, x[f,t]~FLOW;
  2689 \end{verbatim}
  2690 
  2691 The table statement allows reading data from a table into model
  2692 objects such as sets and (non-scalar) parameters as well as writing
  2693 data from the model to a table.
  2694 
  2695 \subsubsection{Table structure}
  2696 
  2697 A {\it data table} is an (unordered) set of {\it records}, where each
  2698 record consists of the same number of {\it fields}, and each field is
  2699 provided with a unique symbolic name called the {\it field name}. For
  2700 example:
  2701 
  2702 \bigskip
  2703 
  2704 \begin{tabular}{@{\hspace*{38mm}}c@{\hspace*{11mm}}c@{\hspace*{10mm}}c
  2705 @{\hspace*{9mm}}c}
  2706 First&Second&&Last\\
  2707 field&field&.\ \ .\ \ .&field\\
  2708 $\downarrow$&$\downarrow$&&$\downarrow$\\
  2709 \end{tabular}
  2710 
  2711 \begin{tabular}{ll@{}}
  2712 Table header&$\rightarrow$\\
  2713 First record&$\rightarrow$\\
  2714 Second record&$\rightarrow$\\
  2715 \\
  2716 \hfil .\ \ .\ \ .\\
  2717 \\
  2718 Last record&$\rightarrow$\\
  2719 \end{tabular}
  2720 \begin{tabular}{|l|l|c|c|}
  2721 \hline
  2722 {\tt FROM}&{\tt TO}&{\tt DISTANCE}&{\tt COST}\\
  2723 \hline
  2724 {\tt Seattle}  &{\tt New-York}&{\tt 2.5}&{\tt 0.12}\\
  2725 {\tt Seattle}  &{\tt Chicago} &{\tt 1.7}&{\tt 0.08}\\
  2726 {\tt Seattle}  &{\tt Topeka}  &{\tt 1.8}&{\tt 0.09}\\
  2727 {\tt San-Diego}&{\tt New-York}&{\tt 2.5}&{\tt 0.15}\\
  2728 {\tt San-Diego}&{\tt Chicago} &{\tt 1.8}&{\tt 0.10}\\
  2729 {\tt San-Diego}&{\tt Topeka}  &{\tt 1.4}&{\tt 0.07}\\
  2730 \hline
  2731 \end{tabular}
  2732 
  2733 \subsubsection{Reading data from input table}
  2734 
  2735 The input table statement causes reading data from the specified table
  2736 record by record.
  2737 
  2738 Once a next record has been read, numeric or symbolic values of fields,
  2739 whose names are enclosed in square brackets in the table statement, are
  2740 gathered into $n$-tuple, and if the control set is specified in the
  2741 table statement, this $n$-tuple is added to it. Besides, a numeric or
  2742 symbolic value of each field associated with a model parameter is
  2743 assigned to the parameter member identified by subscripts, which are
  2744 components of the $n$-tuple just read.
  2745 
  2746 For example, the following input table statement:
  2747 
  2748 \medskip
  2749 
  2750 \noindent\hfil
  2751 \verb|table data IN "...": S <- [FROM,TO], d~DISTANCE, c~COST;|
  2752 
  2753 \medskip
  2754 
  2755 \noindent
  2756 causes reading values of four fields named {\tt FROM}, {\tt TO},
  2757 {\tt DISTANCE}, and {\tt COST} from each record of the specified table.
  2758 Values of fields {\tt FROM} and {\tt TO} give a pair $(f,t)$, which is
  2759 added to the control set {\tt S}. The value of field {\tt DISTANCE} is
  2760 assigned to parameter member ${\tt d}[f,t]$, and the value of field
  2761 {\tt COST} is assigned to parameter member ${\tt c}[f,t]$.
  2762 
  2763 Note that the input table may contain extra fields whose names are not
  2764 specified in the table statement, in which case values of these fields
  2765 on reading the table are ignored.
  2766 
  2767 \subsubsection{Writing data to output table}
  2768 
  2769 The output table statement causes writing data to the specified table.
  2770 Note that some drivers (namely, CSV and xBASE) destroy the output table
  2771 before writing data, i.e. delete all its existing records.
  2772 
  2773 Each $n$-tuple in the specified domain set generates one record written
  2774 to the output table. Values of fields are numeric or symbolic values of
  2775 corresponding expressions specified in the table statement. These
  2776 expressions are evaluated for each $n$-tuple in the domain set and,
  2777 thus, may include dummy indices introduced in the corresponding indexing
  2778 expression.
  2779 
  2780 For example, the following output table statement:
  2781 
  2782 \medskip
  2783 
  2784 \noindent
  2785 \verb|   table result{(f,t) in S} OUT "...": f~FROM, t~TO, x[f,t]~FLOW;|
  2786 
  2787 \medskip
  2788 
  2789 \noindent
  2790 causes writing records, by one record for each pair $(f,t)$ in set
  2791 {\tt S}, to the output table, where each record consists of three
  2792 fields named {\tt FROM}, {\tt TO}, and {\tt FLOW}. The values written
  2793 to fields {\tt FROM} and {\tt TO} are current values of dummy indices
  2794 {\tt f} and {\tt t}, and the value written to field {\tt FLOW} is
  2795 a value of member ${\tt x}[f,t]$ of corresponding subscripted parameter
  2796 or variable.
  2797 
  2798 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2799 
  2800 \newpage
  2801 
  2802 \section{Model data}
  2803 
  2804 {\it Model data} include elemental sets, which are ``values'' of model
  2805 sets, and numeric and symbolic values of model parameters.
  2806 
  2807 In MathProg there are two different ways to saturate model sets and
  2808 parameters with data. One way is simply providing necessary data using
  2809 the assign attribute. However, in many cases it is more practical to
  2810 separate the model itself and particular data needed for the model. For
  2811 the latter reason in MathProg there is another way, when the model
  2812 description is divided into two parts: model section and data section.
  2813 
  2814 A {\it model section} is a main part of the model description that
  2815 contains declarations of all model objects and is common for all
  2816 problems based on that model.
  2817 
  2818 A {\it data section} is an optional part of the model description that
  2819 contains model data specific for a particular problem.
  2820 
  2821 In MathProg model and data sections can be placed either in one text
  2822 file or in two separate text files.
  2823 
  2824 1. If both model and data sections are placed in one file, the file is
  2825 composed as follows:
  2826 
  2827 \bigskip
  2828 
  2829 \noindent\hfil
  2830 \framebox{\begin{tabular}{l}
  2831 {\it statement}{\tt;}\\
  2832 {\it statement}{\tt;}\\
  2833 \hfil.\ \ .\ \ .\\
  2834 {\it statement}{\tt;}\\
  2835 {\tt data;}\\
  2836 {\it data block}{\tt;}\\
  2837 {\it data block}{\tt;}\\
  2838 \hfil.\ \ .\ \ .\\
  2839 {\it data block}{\tt;}\\
  2840 {\tt end;}
  2841 \end{tabular}}
  2842 
  2843 \bigskip
  2844 
  2845 2. If the model and data sections are placed in two separate files, the
  2846 files are composed as follows:
  2847 
  2848 \bigskip
  2849 
  2850 \noindent\hfil
  2851 \begin{tabular}{@{}c@{}}
  2852 \framebox{\begin{tabular}{l}
  2853 {\it statement}{\tt;}\\
  2854 {\it statement}{\tt;}\\
  2855 \hfil.\ \ .\ \ .\\
  2856 {\it statement}{\tt;}\\
  2857 {\tt end;}\\
  2858 \end{tabular}}\\
  2859 \\\\Model file\\
  2860 \end{tabular}
  2861 \hspace{32pt}
  2862 \begin{tabular}{@{}c@{}}
  2863 \framebox{\begin{tabular}{l}
  2864 {\tt data;}\\
  2865 {\it data block}{\tt;}\\
  2866 {\it data block}{\tt;}\\
  2867 \hfil.\ \ .\ \ .\\
  2868 {\it data block}{\tt;}\\
  2869 {\tt end;}\\
  2870 \end{tabular}}\\
  2871 \\Data file\\
  2872 \end{tabular}
  2873 
  2874 \bigskip
  2875 
  2876 \begin{description}
  2877 \item[{\rm Note:}\hspace*{31pt}] If the data section is placed in a
  2878 separate file, the keyword {\tt data} is optional and may be omitted
  2879 along with the semicolon that follows it.
  2880 \end{description}
  2881 
  2882 \subsection{Coding data section}
  2883 
  2884 The {\it data section} is a sequence of data blocks in various formats,
  2885 which are discussed in following subsections. The order, in which data
  2886 blocks follow in the data section, may be arbitrary, not necessarily
  2887 the same, in which corresponding model objects follow in the model
  2888 section.
  2889 
  2890 The rules of coding the data section are commonly the same as the rules
  2891 of coding the model description (see Subsection \ref{coding}, page
  2892 \pageref{coding}), i.e. data blocks are composed from basic lexical
  2893 units such as symbolic names, numeric and string literals, keywords,
  2894 delimiters, and comments. However, for the sake of convenience and
  2895 improving readability there is one deviation from the common rule: if
  2896 a string literal consists of only alphanumeric characters (including
  2897 the underscore character), the signs {\tt+} and {\tt-}, and/or the
  2898 decimal point, it may be coded without bordering by (single or double)
  2899 quotes.
  2900 
  2901 All numeric and symbolic material provided in the data section is coded
  2902 in the form of numbers and symbols, i.e. unlike the model section
  2903 no expressions are allowed in the data section. Nevertheless, the signs
  2904 {\tt+} and {\tt-} can precede numeric literals to allow coding signed
  2905 numeric quantities, in which case there must be no white-space
  2906 characters between the sign and following numeric literal (if there is
  2907 at least one white-space, the sign and following numeric literal are
  2908 recognized as two different lexical units).
  2909 
  2910 \subsection{Set data block}
  2911 
  2912 \medskip
  2913 
  2914 \framebox[345pt][l]{
  2915 \parbox[c][44pt]{345pt}{
  2916 \hspace{6pt} {\tt set} {\it name} {\tt,} {\it record} {\tt,} \dots
  2917 {\tt,} {\it record} {\tt;}
  2918 
  2919 \medskip
  2920 
  2921 \hspace{6pt} {\tt set} {\it name} {\tt[} {\it symbol} {\tt,} \dots
  2922 {\tt,} {\it symbol} {\tt]} {\tt,} {\it record} {\tt,} \dots {\tt,}
  2923 {\it record} {\tt;}
  2924 }}
  2925 
  2926 \setlength{\leftmargini}{60pt}
  2927 
  2928 \begin{description}
  2929 \item[{\rm Where:}\hspace*{23pt}] {\it name} is a symbolic name of the
  2930 set;
  2931 \item[\hspace*{54pt}] {\it symbol}, \dots, {\it symbol} are subscripts,
  2932 which specify a particular member of the set (if the set is an array,
  2933 i.e. a set of sets);
  2934 \item[\hspace*{54pt}] {\it record}, \dots, {\it record} are data
  2935 records.
  2936 \end{description}
  2937 
  2938 \begin{description}
  2939 \item[{\rm Note:}\hspace*{31pt}] Commae preceding data records may be
  2940 omitted.
  2941 \end{description}
  2942 
  2943 \noindent Data records:
  2944 
  2945 \begin{description}
  2946 \item[{\tt :=}\hspace*{45pt}] is a non-significant data record, which
  2947 may be used freely to improve readability;
  2948 \item[{\tt(} {\it slice} {\tt)}\hspace*{18.5pt}] specifies a slice;
  2949 \item[{\it simple-data}\hspace*{5.5pt}] specifies set data in the
  2950 simple format;
  2951 \item[{\tt:} {\it matrix-data}]\hspace*{0pt}\\
  2952 specifies set data in the matrix format;
  2953 \item[{\tt(tr)} {\tt:} {\it matrix-data}]\hspace*{0pt}\\
  2954 specifies set data in the transposed matrix format. (In this case the
  2955 colon following the keyword {\tt(tr)} may be omitted.)
  2956 \end{description}
  2957 
  2958 \noindent{\bf Examples}
  2959 
  2960 \begin{verbatim}
  2961 set month := Jan Feb Mar Apr May Jun;
  2962 set month "Jan", "Feb", "Mar", "Apr", "May", "Jun";
  2963 set A[3,Mar] := (1,2) (2,3) (4,2) (3,1) (2,2) (4,4) (3,4);
  2964 set A[3,'Mar'] := 1 2 2 3 4 2 3 1 2 2 4 4 2 4;
  2965 set A[3,'Mar'] : 1 2 3 4 :=
  2966                1 - + - -
  2967                2 - + + -
  2968                3 + - - +
  2969                4 - + - + ;
  2970 set B := (1,2,3) (1,3,2) (2,3,1) (2,1,3) (1,2,2) (1,1,1) (2,1,1);
  2971 set B := (*,*,*) 1 2 3, 1 3 2, 2 3 1, 2 1 3, 1 2 2, 1 1 1, 2 1 1;
  2972 set B := (1,*,2) 3 2 (2,*,1) 3 1 (1,2,3) (2,1,3) (1,1,1);
  2973 set B := (1,*,*) : 1 2 3 :=
  2974                  1 + - -
  2975                  2 - + +
  2976                  3 - + -
  2977          (2,*,*) : 1 2 3 :=
  2978                  1 + - +
  2979                  2 - - -
  2980                  3 + - - ;
  2981 \end{verbatim}
  2982 
  2983 \noindent(In these examples {\tt month} is a simple set of singlets,
  2984 {\tt A} is a 2-dimensional array of doublets, and {\tt B} is a simple
  2985 set of triplets. Data blocks for the same set are equivalent in the
  2986 sense that they specify the same data in different formats.)
  2987 
  2988 \medskip
  2989 
  2990 The {\it set data block} is used to specify a complete elemental set,
  2991 which is assigned to a set (if it is a simple set) or one of its
  2992 members (if the set is an array of sets).\footnote{There is another way
  2993 to specify data for a simple set along with data for parameters. This
  2994 feature is discussed in the next subsection.}
  2995 
  2996 Data blocks can be specified only for non-computable sets, i.e. for
  2997 sets, which have no assign ({\tt:=}) attribute in the corresponding set
  2998 statements.
  2999 
  3000 If the set is a simple set, only its symbolic name should be specified
  3001 in the header of the data block. Otherwise, if the set is a
  3002 $n$-dimensional array, its symbolic name should be provided with a
  3003 complete list of subscripts separated by commae and enclosed in square
  3004 brackets to specify a particular member of the set array. The number of
  3005 subscripts must be the same as the dimension of the set array, where
  3006 each subscript must be a number or symbol.
  3007 
  3008 An elemental set defined in the set data block is coded as a sequence
  3009 of data records described below.\footnote{{\it Data record} is simply a
  3010 technical term. It does not mean that data records have any special
  3011 formatting.}
  3012 
  3013 \newpage
  3014 
  3015 \subsubsection{Assign data record}
  3016 
  3017 The {\it assign} ({\tt:=}) {\it data record} is a non-signficant
  3018 element. It may be used for improving readability of data blocks.
  3019 
  3020 \subsubsection{Slice data record}
  3021 
  3022 The {\it slice data record} is a control record, which specifies a
  3023 {\it slice} of the elemental set defined in the data block. It has the
  3024 following syntactic form:
  3025 
  3026 \medskip
  3027 
  3028 \noindent\hfil
  3029 {\tt(} $s_1$ {\tt,} $s_2$ {\tt,} \dots {\tt,} $s_n$ {\tt)}
  3030 
  3031 \medskip
  3032 
  3033 \noindent where $s_1$, $s_2$, \dots, $s_n$ are components of the slice.
  3034 
  3035 Each component of the slice can be a number or symbol or the asterisk
  3036 ({\tt*}). The number of components in the slice must be the same as the
  3037 dimension of $n$-tuples in the elemental set to be defined. For
  3038 instance, if the elemental set contains 4-tuples (quadruplets), the
  3039 slice must have four components. The number of asterisks in the slice
  3040 is called the {\it slice dimension}.
  3041 
  3042 The effect of using slices is the following. If a $m$-dimensional slice
  3043 (i.e. a slice having $m$ asterisks) is specified in the data block, all
  3044 subsequent data records must specify tuples of the dimension $m$.
  3045 Whenever a $m$-tuple is encountered, each asterisk in the slice is
  3046 replaced by corresponding components of the $m$-tuple that gives the
  3047 resultant $n$-tuple, which is included in the elemental set to be
  3048 defined. For example, if the slice $(a,*,1,2,*)$ is in effect, and
  3049 2-tuple $(3,b)$ is encountered in a subsequent data record, the
  3050 resultant 5-tuple included in the elemental set is $(a,3,1,2,b)$.
  3051 
  3052 The slice having no asterisks itself defines a complete $n$-tuple,
  3053 which is included in the elemental set.
  3054 
  3055 Being once specified the slice effects until either a new slice or the
  3056 end of data block is encountered. Note that if no slice is specified in
  3057 the data block, one, components of which are all asterisks, is assumed.
  3058 
  3059 \subsubsection{Simple data record}
  3060 
  3061 The {\it simple data record} defines one $n$-tuple in a simple format
  3062 and has the following syntactic form:
  3063 
  3064 \medskip
  3065 
  3066 \noindent\hfil
  3067 $t_1$ {\tt,} $t_2$ {\tt,} \dots {\tt,} $t_n$
  3068 
  3069 \medskip
  3070 
  3071 \noindent where $t_1$, $t_2$, \dots, $t_n$ are components of the
  3072 $n$-tuple. Each component can be a number or symbol. Commae between
  3073 components are optional and may be omitted.
  3074 
  3075 \subsubsection{Matrix data record}
  3076 
  3077 The {\it matrix data record} defines several 2-tuples (doublets) in
  3078 a matrix format and has the following syntactic form:
  3079 
  3080 \newpage
  3081 
  3082 $$\begin{array}{cccccc}
  3083 \mbox{{\tt:}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\
  3084 r_1&a_{11}&a_{12}&\dots&a_{1n}&\\
  3085 r_2&a_{21}&a_{22}&\dots&a_{2n}&\\
  3086 \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\
  3087 r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\
  3088 \end{array}$$
  3089 where $r_1$, $r_2$, \dots, $r_m$ are numbers and/or symbols
  3090 corresponding to rows of the matrix; $c_1$, $c_2$, \dots, $c_n$ are
  3091 numbers and/or symbols corresponding to columns of the matrix, $a_{11}$,
  3092 $a_{12}$, \dots, $a_{mn}$ are matrix elements, which can be either
  3093 {\tt+} or {\tt-}. (In this data record the delimiter {\tt:} preceding
  3094 the column list and the delimiter {\tt:=} following the column list
  3095 cannot be omitted.)
  3096 
  3097 Each element $a_{ij}$ of the matrix data block (where $1\leq i\leq m$,
  3098 $1\leq j\leq n$) corresponds to 2-tuple $(r_i,c_j)$. If $a_{ij}$ is the
  3099 plus sign ({\tt+}), that 2-tuple (or a longer $n$-tuple, if a slice is
  3100 used) is included in the elemental set. Otherwise, if $a_{ij}$ is the
  3101 minus sign ({\tt-}), that 2-tuple is not included in the elemental set.
  3102 
  3103 Since the matrix data record defines 2-tuples, either the elemental set
  3104 must consist of 2-tuples or the slice currently used must be
  3105 2-dimensional.
  3106 
  3107 \subsubsection{Transposed matrix data record}
  3108 
  3109 The {\it transposed matrix data record} has the following syntactic
  3110 form:
  3111 $$\begin{array}{cccccc}
  3112 \mbox{{\tt(tr) :}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\
  3113 r_1&a_{11}&a_{12}&\dots&a_{1n}&\\
  3114 r_2&a_{21}&a_{22}&\dots&a_{2n}&\\
  3115 \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\
  3116 r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\
  3117 \end{array}$$
  3118 (In this case the delimiter {\tt:} following the keyword {\tt(tr)} is
  3119 optional and may be omitted.)
  3120 
  3121 This data record is completely analogous to the matrix data record (see
  3122 above) with only exception that in this case each element $a_{ij}$ of
  3123 the matrix corresponds to 2-tuple $(c_j,r_i)$ rather than $(r_i,c_j)$.
  3124 
  3125 Being once specified the {\tt(tr)} indicator affects all subsequent
  3126 data records until either a slice or the end of data block is
  3127 encountered.
  3128 
  3129 \subsection{Parameter data block}
  3130 
  3131 \medskip
  3132 
  3133 \framebox[345pt][l]{
  3134 \parbox[c][80pt]{345pt}{
  3135 \hspace{6pt} {\tt param} {\it name} {\tt,} {\it record} {\tt,} \dots
  3136 {\tt,} {\it record} {\tt;}
  3137 
  3138 \medskip
  3139 
  3140 \hspace{6pt} {\tt param} {\it name} {\tt default} {\it value} {\tt,}
  3141 {\it record} {\tt,} \dots {\tt,} {\it record} {\tt;}
  3142 
  3143 \medskip
  3144 
  3145 \hspace{6pt} {\tt param} {\tt:} {\it tabbing-data} {\tt;}
  3146 
  3147 \medskip
  3148 
  3149 \hspace{6pt} {\tt param} {\tt default} {\it value} {\tt:}
  3150 {\it tabbing-data} {\tt;}
  3151 }}
  3152 
  3153 \newpage
  3154 
  3155 \setlength{\leftmargini}{60pt}
  3156 
  3157 \begin{description}
  3158 \item[{\rm Where:}\hspace*{23pt}] {\it name} is a symbolic name of the
  3159 parameter;
  3160 \item[\hspace*{54pt}] {\it value} is an optional default value of the
  3161 parameter;
  3162 \item[\hspace*{54pt}] {\it record}, \dots, {\it record} are data
  3163 records;
  3164 \item[\hspace*{54pt}] {\it tabbing-data} specifies parameter data in
  3165 the tabbing format.
  3166 \end{description}
  3167 
  3168 \begin{description}
  3169 \item[{\rm Note:}\hspace*{31pt}] Commae preceding data records may be
  3170 omitted.
  3171 \end{description}
  3172 
  3173 \noindent Data records:
  3174 
  3175 \begin{description}
  3176 \item[{\tt :=}\hspace*{45pt}] is a non-significant data record, which
  3177 may be used freely to improve readability;
  3178 \item[{\tt[} {\it slice} {\tt]}\hspace*{18.5pt}] specifies a slice;
  3179 \item[{\it plain-data}\hspace*{11pt}] specifies parameter data in the
  3180 plain format;
  3181 \item[{\tt:} {\it tabular-data}]\hspace*{0pt}\\
  3182 specifies parameter data in the tabular format;
  3183 \item[{\tt(tr)} {\tt:} {\it tabular-data}]\hspace*{0pt}\\
  3184 specifies set data in the transposed tabular format. (In this case the
  3185 colon following the keyword {\tt(tr)} may be omitted.)
  3186 \end{description}
  3187 
  3188 \noindent{\bf Examples}
  3189 
  3190 \begin{verbatim}
  3191 param T := 4;
  3192 param month := 1 'Jan' 2 'Feb' 3 'Mar' 4 'Apr' 5 'May';
  3193 param month := [1] Jan, [2] Feb, [3] Mar, [4] Apr, [5] May;
  3194 param day := [Sun] 0, [Mon] 1, [Tue] 2, [Wed] 3, [Thu] 4,
  3195              [Fri] 5, [Sat] 6;
  3196 param init_stock := iron 7.32 nickel 35.8;
  3197 param init_stock [*] iron 7.32, nickel 35.8;
  3198 param cost [iron] .025 [nickel] .03;
  3199 param value := iron -.1, nickel .02;
  3200 param       : init_stock cost value :=
  3201       iron       7.32    .025  -.1
  3202       nickel    35.8     .03    .02 ;
  3203 param : raw : init_stock cost value :=
  3204       iron       7.32    .025  -.1
  3205       nickel    35.8     .03    .02 ;
  3206 param demand default 0 (tr)
  3207        :  FRA  DET  LAN  WIN  STL  FRE  LAF :=
  3208    bands  300   .   100   75   .   225  250
  3209    coils  500  750  400  250   .   850  500
  3210    plate  100   .    .    50  200   .   250 ;
  3211 \end{verbatim}
  3212 
  3213 \newpage
  3214 
  3215 \begin{verbatim}
  3216 param trans_cost :=
  3217    [*,*,bands]:  FRA  DET  LAN  WIN  STL  FRE  LAF :=
  3218          GARY     30   10    8   10   11   71    6
  3219          CLEV     22    7   10    7   21   82   13
  3220          PITT     19   11   12   10   25   83   15
  3221    [*,*,coils]:  FRA  DET  LAN  WIN  STL  FRE  LAF :=
  3222          GARY     39   14   11   14   16   82    8
  3223          CLEV     27    9   12    9   26   95   17
  3224          PITT     24   14   17   13   28   99   20
  3225    [*,*,plate]:  FRA  DET  LAN  WIN  STL  FRE  LAF :=
  3226          GARY     41   15   12   16   17   86    8
  3227          CLEV     29    9   13    9   28   99   18
  3228          PITT     26   14   17   13   31  104   20 ;
  3229 \end{verbatim}
  3230 
  3231 The {\it parameter data block} is used to specify complete data for a
  3232 parameter (or parameters, if data are specified in the tabbing format).
  3233 
  3234 Data blocks can be specified only for non-computable parameters, i.e.
  3235 for parameters, which have no assign ({\tt:=}) attribute in the
  3236 corresponding parameter statements.
  3237 
  3238 Data defined in the parameter data block are coded as a sequence of
  3239 data records described below. Additionally the data block can be
  3240 provided with the optional {\tt default} attribute, which specifies a
  3241 default numeric or symbolic value of the parameter (parameters). This
  3242 default value is assigned to the parameter or its members, if
  3243 no appropriate value is defined in the parameter data block. The
  3244 {\tt default} attribute cannot be used, if it is already specified in
  3245 the corresponding parameter statement.
  3246 
  3247 \subsubsection{Assign data record}
  3248 
  3249 The {\it assign} ({\tt:=}) {\it data record} is a non-signficant
  3250 element. It may be used for improving readability of data blocks.
  3251 
  3252 \subsubsection{Slice data record}
  3253 
  3254 The {\it slice data record} is a control record, which specifies a
  3255 {\it slice} of the parameter array. It has the following syntactic form:
  3256 
  3257 \medskip
  3258 
  3259 \noindent\hfil
  3260 {\tt[} $s_1$ {\tt,} $s_2$ {\tt,} \dots {\tt,} $s_n$ {\tt]}
  3261 
  3262 \medskip
  3263 
  3264 \noindent where $s_1$, $s_2$, \dots, $s_n$ are components of the slice.
  3265 
  3266 Each component of the slice can be a number or symbol or the asterisk
  3267 ({\tt*}). The number of components in the slice must be the same as the
  3268 dimension of the parameter. For instance, if the parameter is a
  3269 4-dimensional array, the slice must have four components. The number of
  3270 asterisks in the slice is called the {\it slice dimension}.
  3271 
  3272 The effect of using slices is the following. If a $m$-dimensional slice
  3273 (i.e. a slice having $m$ asterisks) is specified in the data block, all
  3274 subsequent data records must specify subscripts of the parameter
  3275 members as if the parameter were $m$-dimensional, not $n$-dimensional.
  3276 
  3277 Whenever $m$ subscripts are encountered, each asterisk in the slice is
  3278 replaced by corresponding subscript that gives $n$ subscripts, which
  3279 define the actual parameter member. For example, if the slice
  3280 $[a,*,1,2,*]$ is in effect, and subscripts 3 and $b$ are encountered in
  3281 a subsequent data record, the complete subscript list used to choose a
  3282 parameter member is $[a,3,1,2,b]$.
  3283 
  3284 It is allowed to specify a slice having no asterisks. Such slice itself
  3285 defines a complete subscript list, in which case the next data record
  3286 should define only a single value of corresponding parameter member.
  3287 
  3288 Being once specified the slice effects until either a new slice or the
  3289 end of data block is encountered. Note that if no slice is specified in
  3290 the data block, one, components of which are all asterisks, is assumed.
  3291 
  3292 \subsubsection{Plain data record}
  3293 
  3294 The {\it plain data record} defines a subscript list and a single value
  3295 in the plain format. This record has the following syntactic form:
  3296 
  3297 \medskip
  3298 
  3299 \noindent\hfil
  3300 $t_1$ {\tt,} $t_2$ {\tt,} \dots {\tt,} $t_n$ {\tt,} $v$
  3301 
  3302 \medskip
  3303 
  3304 \noindent where $t_1$, $t_2$, \dots, $t_n$ are subscripts, and $v$ is a
  3305 value. Each subscript as well as the value can be a number or symbol.
  3306 Commae following subscripts are optional and may be omitted.
  3307 
  3308 In case of 0-dimensional parameter or slice the plain data record has
  3309 no subscripts and consists of a single value only.
  3310 
  3311 \subsubsection{Tabular data record}
  3312 
  3313 The {\it tabular data record} defines several values, where each value
  3314 is provided with two subscripts. This record has the following
  3315 syntactic form:
  3316 $$\begin{array}{cccccc}
  3317 \mbox{{\tt:}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\
  3318 r_1&a_{11}&a_{12}&\dots&a_{1n}&\\
  3319 r_2&a_{21}&a_{22}&\dots&a_{2n}&\\
  3320 \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\
  3321 r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\
  3322 \end{array}$$
  3323 where $r_1$, $r_2$, \dots, $r_m$ are numbers and/or symbols
  3324 corresponding to rows of the table; $c_1$, $c_2$, \dots, $c_n$ are
  3325 numbers and/or symbols corresponding to columns of the table, $a_{11}$,
  3326 $a_{12}$, \dots, $a_{mn}$ are table elements. Each element can be a
  3327 number or symbol or the single decimal point ({\tt.}). (In this data
  3328 record the delimiter {\tt:} preceding the column list and the delimiter
  3329 {\tt:=} following the column list cannot be omitted.)
  3330 
  3331 Each element $a_{ij}$ of the tabular data block ($1\leq i\leq m$,
  3332 $1\leq j\leq n$) defines two subscripts, where the first subscript is
  3333 $r_i$, and the second one is $c_j$. These subscripts are used in
  3334 conjunction with the current slice to form the complete subscript list
  3335 that identifies a particular member of the parameter array. If $a_{ij}$
  3336 is a number or symbol, this value is assigned to the parameter member.
  3337 However, if $a_{ij}$ is the single decimal point, the member is
  3338 assigned a default value specified either in the parameter data block
  3339 or in the parameter statement, or, if no default value is specified,
  3340 the member remains undefined.
  3341 
  3342 Since the tabular data record provides two subscripts for each value,
  3343 either the parameter or the slice currently used must be 2-dimensional.
  3344 
  3345 \subsubsection{Transposed tabular data record}
  3346 
  3347 The {\it transposed tabular data record} has the following syntactic
  3348 form:
  3349 $$\begin{array}{cccccc}
  3350 \mbox{{\tt(tr) :}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\
  3351 r_1&a_{11}&a_{12}&\dots&a_{1n}&\\
  3352 r_2&a_{21}&a_{22}&\dots&a_{2n}&\\
  3353 \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\
  3354 r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\
  3355 \end{array}$$
  3356 (In this case the delimiter {\tt:} following the keyword {\tt(tr)} is
  3357 optional and may be omitted.)
  3358 
  3359 This data record is completely analogous to the tabular data record
  3360 (see above) with only exception that the first subscript defined by
  3361 element $a_{ij}$ is $c_j$ while the second one is $r_i$.
  3362 
  3363 Being once specified the {\tt(tr)} indicator affects all subsequent
  3364 data records until either a slice or the end of data block is
  3365 encountered.
  3366 
  3367 \subsubsection{Tabbing data format}
  3368 
  3369 The parameter data block in the {\it tabbing format} has the following
  3370 syntactic form:
  3371 $$\begin{array}{p{12pt}@{\ }l@{\ }c@{\ }l@{\ }c@{\ }l@{\ }r@{\ }l@{\ }c
  3372 @{\ }l@{\ }c@{\ }l@{\ }l}
  3373 \multicolumn{7}{@{}c@{}}{\mbox{\tt param}\ \mbox{\tt default}\ \mbox
  3374 {\it value}\ \mbox{\tt:}\ \mbox{\it s}\ \mbox{\tt:}}&
  3375 p_1&\mbox{\tt,}&p_2&\mbox{\tt,} \dots \mbox{\tt,}&p_k&\mbox{\tt:=}\\
  3376 &t_{11}&\mbox{\tt,}&t_{12}&\mbox{\tt,} \dots \mbox{\tt,}&t_{1n}&
  3377 \mbox{\tt,}&a_{11}&\mbox{\tt,}&a_{12}&\mbox{\tt,} \dots \mbox{\tt,}&
  3378 a_{1k}\\
  3379 &t_{21}&\mbox{\tt,}&t_{22}&\mbox{\tt,} \dots \mbox{\tt,}&t_{2n}&
  3380 \mbox{\tt,}&a_{21}&\mbox{\tt,}&a_{22}&\mbox{\tt,} \dots \mbox{\tt,}&
  3381 a_{2k}\\
  3382 \multicolumn{13}{c}
  3383 {.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}\\
  3384 &t_{m1}&\mbox{\tt,}&t_{m2}&\mbox{\tt,} \dots \mbox{\tt,}&t_{mn}&
  3385 \mbox{\tt,}&a_{m1}&\mbox{\tt,}&a_{m2}&\mbox{\tt,} \dots \mbox{\tt,}&
  3386 a_{mk}&\mbox{\tt;}\\
  3387 \end{array}$$
  3388 
  3389 {\it Notes:}
  3390 
  3391 1. The keyword {\tt default} may be omitted along with a value
  3392 following it.
  3393 
  3394 2. Symbolic name {\tt s} may be omitted along with the colon following
  3395 it.
  3396 
  3397 3. All comae are optional and may be omitted.
  3398 
  3399 \medskip
  3400 
  3401 The data block in the tabbing format shown above is exactly equivalent
  3402 to the following data blocks for $j=1,2,\dots,k$:
  3403 
  3404 \medskip
  3405 
  3406 {\tt set} {\it s} {\tt:=}
  3407 {\tt(}$t_{11}${\tt,}$t_{12}${\tt,}\dots{\tt,}$t_{1n}${\tt)}
  3408 {\tt(}$t_{21}${\tt,}$t_{22}${\tt,}\dots{\tt,}$t_{2n}${\tt)} \dots
  3409 {\tt(}$t_{m1}${\tt,}$t_{m2}${\tt,}\dots{\tt,}$t_{mn}${\tt)} {\tt;}
  3410 
  3411 {\tt param} $p_j$ {\tt default} {\it value} {\tt:=}
  3412 
  3413 $\!${\tt[}$t_{11}${\tt,}$t_{12}${\tt,}\dots{\tt,}$t_{1n}${\tt]}
  3414 $a_{1j}$
  3415 {\tt[}$t_{21}${\tt,}$t_{22}${\tt,}\dots{\tt,}$t_{2n}${\tt]} $a_{2j}$
  3416 \dots
  3417 {\tt[}$t_{m1}${\tt,}$t_{m2}${\tt,}\dots{\tt,}$t_{mn}${\tt]} $a_{mj}$
  3418 {\tt;}
  3419 
  3420 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3421 
  3422 \appendix
  3423 
  3424 \newpage
  3425 
  3426 \section{Using suffixes}
  3427 
  3428 Suffixes can be used to retrieve additional values associated with
  3429 model variables, constraints, and objectives.
  3430 
  3431 A {\it suffix} consists of a period ({\tt.}) followed by a non-reserved
  3432 keyword. For example, if {\tt x} is a two-dimensional variable,
  3433 {\tt x[i,j].lb} is a numeric value equal to the lower bound of
  3434 elemental variable {\tt x[i,j]}, which (value) can be used everywhere
  3435 in expressions like a numeric parameter.
  3436 
  3437 For model variables suffixes have the following meaning:
  3438 
  3439 \medskip
  3440 
  3441 \begin{tabular}{@{}p{96pt}p{222pt}@{}}
  3442 {\tt.lb}&lower bound\\
  3443 {\tt.ub}&upper bound\\
  3444 {\tt.status}&status in the solution:\\
  3445 &0 --- undefined\\
  3446 &1 --- basic\\
  3447 &2 --- non-basic on lower bound\\
  3448 &3 --- non-basic on upper bound\\
  3449 &4 --- non-basic free (unbounded) variable\\
  3450 &5 --- non-basic fixed variable\\
  3451 {\tt.val}&primal value in the solution\\
  3452 {\tt.dual}&dual value (reduced cost) in the solution\\
  3453 \end{tabular}
  3454 
  3455 \medskip
  3456 
  3457 For model constraints and objectives suffixes have the following
  3458 meaning:
  3459 
  3460 \medskip
  3461 
  3462 \begin{tabular}{@{}p{96pt}p{222pt}@{}}
  3463 {\tt.lb}&lower bound of the linear form\\
  3464 {\tt.ub}&upper bound of the linear form\\
  3465 {\tt.status}&status in the solution:\\
  3466 &0 --- undefined\\
  3467 &1 --- non-active\\
  3468 &2 --- active on lower bound\\
  3469 &3 --- active on upper bound\\
  3470 &4 --- active free (unbounded) row\\
  3471 &5 --- active equality constraint\\
  3472 {\tt.val}&primal value of the linear form in the solution\\
  3473 {\tt.dual}&dual value (reduced cost) of the linear form in the
  3474 solution\\
  3475 \end{tabular}
  3476 
  3477 \medskip
  3478 
  3479 Note that suffixes {\tt.status}, {\tt.val}, and {\tt.dual} can be used
  3480 only below the solve statement.
  3481 
  3482 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3483 
  3484 \newpage
  3485 
  3486 \section{Date and time functions}
  3487 
  3488 \noindent\hfil
  3489 by Andrew Makhorin \verb|<mao@gnu.org>|
  3490 
  3491 \noindent\hfil
  3492 and Heinrich Schuchardt \verb|<heinrich.schuchardt@gmx.de>|
  3493 
  3494 \subsection{Obtaining current calendar time}
  3495 \label{gmtime}
  3496 
  3497 To obtain the current calendar time in MathProg there exists the
  3498 function {\tt gmtime}. It has no arguments and returns the number of
  3499 seconds elapsed since 00:00:00 on January 1, 1970, Coordinated
  3500 Universal Time (UTC). For example:
  3501 
  3502 \medskip
  3503 
  3504 \verb|   param utc := gmtime();|
  3505 
  3506 \medskip
  3507 
  3508 MathProg has no function to convert UTC time returned by the function
  3509 {\tt gmtime} to {\it local} calendar times. Thus, if you need to
  3510 determine the current local calendar time, you have to add to the UTC
  3511 time returned the time offset from UTC expressed in seconds. For
  3512 example, the time in Berlin during the winter is one hour ahead of UTC
  3513 that corresponds to the time offset +1 hour = +3600 secs, so the
  3514 current winter calendar time in Berlin may be determined as follows:
  3515 
  3516 \medskip
  3517 
  3518 \verb|   param now := gmtime() + 3600;|
  3519 
  3520 \medskip
  3521 
  3522 \noindent Similarly, the summer time in Chicago (Central Daylight Time)
  3523 is five hours behind UTC, so the corresponding current local calendar
  3524 time may be determined as follows:
  3525 
  3526 \medskip
  3527 
  3528 \verb|   param now := gmtime() - 5 * 3600;|
  3529 
  3530 \medskip
  3531 
  3532 Note that the value returned by {\tt gmtime} is volatile, i.e. being
  3533 called several times this function may return different values.
  3534 
  3535 \subsection{Converting character string to calendar time}
  3536 \label{str2time}
  3537 
  3538 The function {\tt str2time(}{\it s}{\tt,} {\it f}{\tt)} converts a
  3539 character string (timestamp) specified by its first argument {\it s},
  3540 which must be a symbolic expression, to the calendar time suitable for
  3541 arithmetic calculations. The conversion is controlled by the specified
  3542 format string {\it f} (the second argument), which also must be a
  3543 symbolic expression.
  3544 
  3545 The result of conversion returned by {\tt str2time} has the same
  3546 meaning as values returned by the function {\tt gmtime} (see Subsection
  3547 \ref{gmtime}, page \pageref{gmtime}). Note that {\tt str2time} does
  3548 {\tt not} correct the calendar time returned for the local timezone,
  3549 i.e. being applied to 00:00:00 on January 1, 1970 it always returns 0.
  3550 
  3551 For example, the model statements:
  3552 
  3553 \medskip
  3554 
  3555 \verb|   param s, symbolic, := "07/14/98 13:47";|
  3556 
  3557 \verb|   param t := str2time(s, "%m/%d/%y %H:%M");|
  3558 
  3559 \verb|   display t;|
  3560 
  3561 \medskip
  3562 
  3563 \noindent produce the following printout:
  3564 
  3565 \medskip
  3566 
  3567 \verb|   t = 900424020|
  3568 
  3569 \medskip
  3570 
  3571 \noindent where the calendar time printed corresponds to 13:47:00 on
  3572 July 14, 1998.
  3573 
  3574 \newpage
  3575 
  3576 The format string passed to the function {\tt str2time} consists of
  3577 conversion specifiers and ordinary characters. Each conversion
  3578 specifier begins with a percent ({\tt\%}) character followed by a
  3579 letter.
  3580 
  3581 The following conversion specifiers may be used in the format string:
  3582 
  3583 \medskip
  3584 
  3585 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3586 {\tt\%b}&The abbreviated month name (case insensitive). At least three
  3587 first letters of the month name must appear in the input string.\\
  3588 \end{tabular}
  3589 
  3590 \medskip
  3591 
  3592 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3593 {\tt\%d}&The day of the month as a decimal number (range 1 to 31).
  3594 Leading zero is permitted, but not required.\\
  3595 \end{tabular}
  3596 
  3597 \medskip
  3598 
  3599 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3600 {\tt\%h}&The same as {\tt\%b}.\\
  3601 \end{tabular}
  3602 
  3603 \medskip
  3604 
  3605 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3606 {\tt\%H}&The hour as a decimal number, using a 24-hour clock (range 0
  3607 to 23). Leading zero is permitted, but not required.\\
  3608 \end{tabular}
  3609 
  3610 \medskip
  3611 
  3612 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3613 {\tt\%m}&The month as a decimal number (range 1 to 12). Leading zero is
  3614 permitted, but not required.\\
  3615 \end{tabular}
  3616 
  3617 \medskip
  3618 
  3619 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3620 {\tt\%M}&The minute as a decimal number (range 0 to 59). Leading zero
  3621 is permitted, but not required.\\
  3622 \end{tabular}
  3623 
  3624 \medskip
  3625 
  3626 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3627 {\tt\%S}&The second as a decimal number (range 0 to 60). Leading zero
  3628 is permitted, but not required.\\
  3629 \end{tabular}
  3630 
  3631 \medskip
  3632 
  3633 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3634 {\tt\%y}&The year without a century as a decimal number (range 0 to 99).
  3635 Leading zero is permitted, but not required. Input values in the range
  3636 0 to 68 are considered as the years 2000 to 2068 while the values 69 to
  3637 99 as the years 1969 to 1999.\\
  3638 \end{tabular}
  3639 
  3640 \medskip
  3641 
  3642 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3643 {\tt\%z}&The offset from GMT in ISO 8601 format.\\
  3644 \end{tabular}
  3645 
  3646 \medskip
  3647 
  3648 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3649 {\tt\%\%}&A literal {\tt\%} character.\\
  3650 \end{tabular}
  3651 
  3652 \medskip
  3653 
  3654 All other (ordinary) characters in the format string must have a
  3655 matching character in the input string to be converted. Exceptions are
  3656 spaces in the input string which can match zero or more space
  3657 characters in the format string.
  3658 
  3659 If some date and/or time component(s) are missing in the format and,
  3660 therefore, in the input string, the function {\tt str2time} uses their
  3661 default values corresponding to 00:00:00 on January 1, 1970, that is,
  3662 the default value of the year is 1970, the default value of the month
  3663 is January, etc.
  3664 
  3665 The function {\tt str2time} is applicable to all calendar times in the
  3666 range 00:00:00 on January 1, 0001 to 23:59:59 on December 31, 4000 of
  3667 the Gregorian calendar.
  3668 
  3669 \subsection{Converting calendar time to character string}
  3670 \label{time2str}
  3671 
  3672 The function {\tt time2str(}{\it t}{\tt,} {\it f}{\tt)} converts the
  3673 calendar time specified by its first argument {\it t}, which must be a
  3674 numeric expression, to a character string (symbolic value). The
  3675 conversion is controlled by the specified format string {\it f} (the
  3676 second argument), which must be a symbolic expression.
  3677 
  3678 The calendar time passed to {\tt time2str} has the same meaning as
  3679 values returned by the function {\tt gmtime} (see Subsection
  3680 \ref{gmtime}, page \pageref{gmtime}). Note that {\tt time2str} does
  3681 {\it not} correct the specified calendar time for the local timezone,
  3682 i.e. the calendar time 0 always corresponds to 00:00:00 on January 1,
  3683 1970.
  3684 
  3685 For example, the model statements:
  3686 
  3687 \medskip
  3688 
  3689 \verb|   param s, symbolic, := time2str(gmtime(), "%FT%TZ");|
  3690 
  3691 \verb|   display s;|
  3692 
  3693 \medskip
  3694 
  3695 \noindent may produce the following printout:
  3696 
  3697 \medskip
  3698 
  3699 \verb|   s = '2008-12-04T00:23:45Z'|
  3700 
  3701 \medskip
  3702 
  3703 \noindent which is a timestamp in the ISO format.
  3704 
  3705 The format string passed to the function {\tt time2str} consists of
  3706 conversion specifiers and ordinary characters. Each conversion
  3707 specifier begins with a percent ({\tt\%}) character followed by a
  3708 letter.
  3709 
  3710 The following conversion specifiers may be used in the format string:
  3711 
  3712 \medskip
  3713 
  3714 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3715 {\tt\%a}&The abbreviated (2-character) weekday name.\\
  3716 \end{tabular}
  3717 
  3718 \medskip
  3719 
  3720 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3721 {\tt\%A}&The full weekday name.\\
  3722 \end{tabular}
  3723 
  3724 \medskip
  3725 
  3726 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3727 {\tt\%b}&The abbreviated (3-character) month name.\\
  3728 \end{tabular}
  3729 
  3730 \medskip
  3731 
  3732 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3733 {\tt\%B}&The full month name.\\
  3734 \end{tabular}
  3735 
  3736 \medskip
  3737 
  3738 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3739 {\tt\%C}&The century of the year, that is the greatest integer not
  3740 greater than the year divided by 100.\\
  3741 \end{tabular}
  3742 
  3743 \medskip
  3744 
  3745 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3746 {\tt\%d}&The day of the month as a decimal number (range 01 to 31).\\
  3747 \end{tabular}
  3748 
  3749 \medskip
  3750 
  3751 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3752 {\tt\%D}&The date using the format \verb|%m/%d/%y|.\\
  3753 \end{tabular}
  3754 
  3755 \medskip
  3756 
  3757 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3758 {\tt\%e}&The day of the month like with \verb|%d|, but padded with
  3759 blank rather than zero.\\
  3760 \end{tabular}
  3761 
  3762 \medskip
  3763 
  3764 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3765 {\tt\%F}&The date using the format \verb|%Y-%m-%d|.\\
  3766 \end{tabular}
  3767 
  3768 \medskip
  3769 
  3770 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3771 {\tt\%g}&The year corresponding to the ISO week number, but without the
  3772 century (range 00 to 99). This has the same format and value as
  3773 \verb|%y|, except that if the ISO week number (see \verb|%V|) belongs
  3774 to the previous or next year, that year is used instead.\\
  3775 \end{tabular}
  3776 
  3777 \medskip
  3778 
  3779 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3780 {\tt\%G}&The year corresponding to the ISO week number. This has the
  3781 same format and value as \verb|%Y|, except that if the ISO week number
  3782 (see \verb|%V|) belongs to the previous or next year, that year is used
  3783 instead.
  3784 \end{tabular}
  3785 
  3786 \medskip
  3787 
  3788 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3789 {\tt\%h}&The same as \verb|%b|.\\
  3790 \end{tabular}
  3791 
  3792 \medskip
  3793 
  3794 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3795 {\tt\%H}&The hour as a decimal number, using a 24-hour clock (range 00
  3796 to 23).\\
  3797 \end{tabular}
  3798 
  3799 \medskip
  3800 
  3801 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3802 {\tt\%I}&The hour as a decimal number, using a 12-hour clock (range 01
  3803 to 12).\\
  3804 \end{tabular}
  3805 
  3806 \medskip
  3807 
  3808 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3809 {\tt\%j}&The day of the year as a decimal number (range 001 to 366).\\
  3810 \end{tabular}
  3811 
  3812 \medskip
  3813 
  3814 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3815 {\tt\%k}&The hour as a decimal number, using a 24-hour clock like
  3816 \verb|%H|, but padded with blank rather than zero.\\
  3817 \end{tabular}
  3818 
  3819 \medskip
  3820 
  3821 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3822 {\tt\%l}&The hour as a decimal number, using a 12-hour clock like
  3823 \verb|%I|, but padded with blank rather than zero.
  3824 \end{tabular}
  3825 
  3826 \medskip
  3827 
  3828 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3829 {\tt\%m}&The month as a decimal number (range 01 to 12).\\
  3830 \end{tabular}
  3831 
  3832 \medskip
  3833 
  3834 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3835 {\tt\%M}&The minute as a decimal number (range 00 to 59).\\
  3836 \end{tabular}
  3837 
  3838 \medskip
  3839 
  3840 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3841 {\tt\%p}&Either {\tt AM} or {\tt PM}, according to the given time value.
  3842 Midnight is treated as {\tt AM} and noon as {\tt PM}.\\
  3843 \end{tabular}
  3844 
  3845 \medskip
  3846 
  3847 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3848 {\tt\%P}&Either {\tt am} or {\tt pm}, according to the given time value.
  3849 Midnight is treated as {\tt am} and noon as {\tt pm}.\\
  3850 \end{tabular}
  3851 
  3852 \medskip
  3853 
  3854 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3855 {\tt\%R}&The hour and minute in decimal numbers using the format
  3856 \verb|%H:%M|.\\
  3857 \end{tabular}
  3858 
  3859 \medskip
  3860 
  3861 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3862 {\tt\%S}&The second as a decimal number (range 00 to 59).\\
  3863 \end{tabular}
  3864 
  3865 \medskip
  3866 
  3867 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3868 {\tt\%T}&The time of day in decimal numbers using the format
  3869 \verb|%H:%M:%S|.\\
  3870 \end{tabular}
  3871 
  3872 \medskip
  3873 
  3874 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3875 {\tt\%u}&The day of the week as a decimal number (range 1 to 7), Monday
  3876 being 1.\\
  3877 \end{tabular}
  3878 
  3879 \medskip
  3880 
  3881 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3882 {\tt\%U}&The week number of the current year as a decimal number (range
  3883 00 to 53), starting with the first Sunday as the first day of the first
  3884 week. Days preceding the first Sunday in the year are considered to be
  3885 in week 00.
  3886 \end{tabular}
  3887 
  3888 \medskip
  3889 
  3890 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3891 {\tt\%V}&The ISO week number as a decimal number (range 01 to 53). ISO
  3892 weeks start with Monday and end with Sunday. Week 01 of a year is the
  3893 first week which has the majority of its days in that year; this is
  3894 equivalent to the week containing January 4. Week 01 of a year can
  3895 contain days from the previous year. The week before week 01 of a year
  3896 is the last week (52 or 53) of the previous year even if it contains
  3897 days from the new year. In other word, if 1 January is Monday, Tuesday,
  3898 Wednesday or Thursday, it is in week 01; if 1 January is Friday,
  3899 Saturday or Sunday, it is in week 52 or 53 of the previous year.\\
  3900 \end{tabular}
  3901 
  3902 \medskip
  3903 
  3904 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3905 {\tt\%w}&The day of the week as a decimal number (range 0 to 6), Sunday
  3906 being 0.\\
  3907 \end{tabular}
  3908 
  3909 \medskip
  3910 
  3911 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3912 {\tt\%W}&The week number of the current year as a decimal number (range
  3913 00 to 53), starting with the first Monday as the first day of the first
  3914 week. Days preceding the first Monday in the year are considered to be
  3915 in week 00.\\
  3916 \end{tabular}
  3917 
  3918 \medskip
  3919 
  3920 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3921 {\tt\%y}&The year without a century as a decimal number (range 00 to
  3922 99), that is the year modulo 100.\\
  3923 \end{tabular}
  3924 
  3925 \medskip
  3926 
  3927 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3928 {\tt\%Y}&The year as a decimal number, using the Gregorian calendar.\\
  3929 \end{tabular}
  3930 
  3931 \medskip
  3932 
  3933 \begin{tabular}{@{}p{20pt}p{298pt}@{}}
  3934 {\tt\%\%}&A literal \verb|%| character.\\
  3935 \end{tabular}
  3936 
  3937 \medskip
  3938 
  3939 All other (ordinary) characters in the format string are simply copied
  3940 to the resultant string.
  3941 
  3942 The first argument (calendar time) passed to the function {\tt time2str}
  3943 must be in the range from $-62135596800$ to $+64092211199$ that
  3944 corresponds to the period from 00:00:00 on January 1, 0001 to 23:59:59
  3945 on December 31, 4000 of the Gregorian calendar.
  3946 
  3947 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3948 
  3949 \newpage
  3950 
  3951 \section{Table drivers}
  3952 \label{drivers}
  3953 
  3954 \noindent\hfil
  3955 by Andrew Makhorin \verb|<mao@gnu.org>|
  3956 
  3957 \noindent\hfil
  3958 and Heinrich Schuchardt \verb|<heinrich.schuchardt@gmx.de>|
  3959 
  3960 \bigskip\bigskip
  3961 
  3962 The {\it table driver} is a program module which provides transmitting
  3963 data between MathProg model objects and data tables.
  3964 
  3965 Currently the GLPK package has four table drivers:
  3966 
  3967 \setlength{\leftmargini}{2.5em}
  3968 
  3969 \begin{itemize}
  3970 \item built-in CSV table driver;
  3971 \item built-in xBASE table driver;
  3972 \item ODBC table driver;
  3973 \item MySQL table driver.
  3974 \end{itemize}
  3975 
  3976 \subsection{CSV table driver}
  3977 
  3978 The CSV table driver assumes that the data table is represented in the
  3979 form of a plain text file in the CSV (comma-separated values) file
  3980 format as described below.
  3981 
  3982 To choose the CSV table driver its name in the table statement should
  3983 be specified as \verb|"CSV"|, and the only argument should specify the
  3984 name of a plain text file containing the table. For example:
  3985 
  3986 \medskip
  3987 
  3988 \verb|   table data IN "CSV" "data.csv": ... ;|
  3989 
  3990 \medskip
  3991 
  3992 The filename suffix may be arbitrary, however, it is recommended to use
  3993 the suffix `\verb|.csv|'.
  3994 
  3995 On reading input tables the CSV table driver provides an implicit field
  3996 named \verb|RECNO|, which contains the current record number. This
  3997 field can be specified in the input table statement as if there were
  3998 the actual field having the name \verb|RECNO| in the CSV file. For
  3999 example:
  4000 
  4001 \medskip
  4002 
  4003 \verb|   table list IN "CSV" "list.csv": num <- [RECNO], ... ;|
  4004 
  4005 \subsubsection*{CSV format\footnote{This material is based on the RFC
  4006 document 4180.}}
  4007 
  4008 The CSV (comma-separated values) format is a plain text file format
  4009 defined as follows.
  4010 
  4011 1. Each record is located on a separate line, delimited by a line
  4012 break. For example:
  4013 
  4014 \medskip
  4015 
  4016 \verb|   aaa,bbb,ccc\n|
  4017 
  4018 \verb|   xxx,yyy,zzz\n|
  4019 
  4020 \medskip
  4021 
  4022 \noindent
  4023 where \verb|\n| means the control character \verb|LF| ({\tt 0x0A}).
  4024 
  4025 \newpage
  4026 
  4027 2. The last record in the file may or may not have an ending line
  4028 break. For example:
  4029 
  4030 \medskip
  4031 
  4032 \verb|   aaa,bbb,ccc\n|
  4033 
  4034 \verb|   xxx,yyy,zzz|
  4035 
  4036 \medskip
  4037 
  4038 3. There should be a header line appearing as the first line of the
  4039 file in the same format as normal record lines. This header should
  4040 contain names corresponding to the fields in the file. The number of
  4041 field names in the header line should be the same as the number of
  4042 fields in the records of the file. For example:
  4043 
  4044 \medskip
  4045 
  4046 \verb|   name1,name2,name3\n|
  4047 
  4048 \verb|   aaa,bbb,ccc\n|
  4049 
  4050 \verb|   xxx,yyy,zzz\n|
  4051 
  4052 \medskip
  4053 
  4054 4. Within the header and each record there may be one or more fields
  4055 separated by commas. Each line should contain the same number of fields
  4056 throughout the file. Spaces are considered as part of a field and
  4057 therefore not ignored. The last field in the record should not be
  4058 followed by a comma. For example:
  4059 
  4060 \medskip
  4061 
  4062 \verb|   aaa,bbb,ccc\n|
  4063 
  4064 \medskip
  4065 
  4066 5. Fields may or may not be enclosed in double quotes. For example:
  4067 
  4068 \medskip
  4069 
  4070 \verb|   "aaa","bbb","ccc"\n|
  4071 
  4072 \verb|   zzz,yyy,xxx\n|
  4073 
  4074 \medskip
  4075 
  4076 6. If a field is enclosed in double quotes, each double quote which is
  4077 part of the field should be coded twice. For example:
  4078 
  4079 \medskip
  4080 
  4081 \verb|   "aaa","b""bb","ccc"\n|
  4082 
  4083 \medskip
  4084 
  4085 \noindent{\bf Example}
  4086 
  4087 \begin{verbatim}
  4088 FROM,TO,DISTANCE,COST
  4089 Seattle,New-York,2.5,0.12
  4090 Seattle,Chicago,1.7,0.08
  4091 Seattle,Topeka,1.8,0.09
  4092 San-Diego,New-York,2.5,0.15
  4093 San-Diego,Chicago,1.8,0.10
  4094 San-Diego,Topeka,1.4,0.07
  4095 \end{verbatim}
  4096 
  4097 \subsection{xBASE table driver}
  4098 
  4099 The xBASE table driver assumes that the data table is stored in the
  4100 .dbf file format.
  4101 
  4102 To choose the xBASE table driver its name in the table statement should
  4103 be specified as \verb|"xBASE"|, and the first argument should specify
  4104 the name of a .dbf file containing the table. For the output table there
  4105 should be the second argument defining the table format in the form
  4106 \verb|"FF...F"|, where \verb|F| is either {\tt C({\it n})},
  4107 which specifies a character field of length $n$, or
  4108 {\tt N({\it n}{\rm [},{\it p}{\rm ]})}, which specifies a numeric field
  4109 of length $n$ and precision $p$ (by default $p$ is 0).
  4110 
  4111 The following is a simple example which illustrates creating and
  4112 reading a .dbf file:
  4113 
  4114 \begin{verbatim}
  4115 table tab1{i in 1..10} OUT "xBASE" "foo.dbf"
  4116    "N(5)N(10,4)C(1)C(10)": 2*i+1 ~ B, Uniform(-20,+20) ~ A,
  4117    "?" ~ FOO, "[" & i & "]" ~ C;
  4118 set S, dimen 4;
  4119 table tab2 IN "xBASE" "foo.dbf": S <- [B, C, RECNO, A];
  4120 display S;
  4121 end;
  4122 \end{verbatim}
  4123 
  4124 \subsection{ODBC table driver}
  4125 
  4126 The ODBC table driver allows connecting to SQL databases using an
  4127 implementation of the ODBC interface based on the Call Level Interface
  4128 (CLI).\footnote{The corresponding software standard is defined in
  4129 ISO/IEC 9075-3:2003.}
  4130 
  4131 \paragraph{Debian GNU/Linux.}
  4132 Under Debian GNU/Linux the ODBC table driver uses the iODBC
  4133 package,\footnote{See {\tt<http://www.iodbc.org/>}.} which should be
  4134 installed before building the GLPK package. The installation can be
  4135 effected with the following command:
  4136 
  4137 \begin{verbatim}
  4138 sudo apt-get install libiodbc2-dev
  4139 \end{verbatim}
  4140 
  4141 Note that on configuring the GLPK package to enable using the iODBC
  4142 library the option `\verb|--enable-odbc|' should be passed to the
  4143 configure script.
  4144 
  4145 The individual databases must be entered for systemwide usage in
  4146 \linebreak \verb|/etc/odbc.ini| and \verb|/etc/odbcinst.ini|. Database
  4147 connections to be used by a single user are specified by files in the
  4148 home directory (\verb|.odbc.ini| and \verb|.odbcinst.ini|).
  4149 
  4150 \paragraph{Microsoft Windows.}
  4151 Under Microsoft Windows the ODBC table driver uses the Microsoft ODBC
  4152 library. To enable this feature the symbol:
  4153 
  4154 \begin{verbatim}
  4155 #define ODBC_DLNAME "odbc32.dll"
  4156 \end{verbatim}
  4157 
  4158 \noindent
  4159 should be defined in the GLPK configuration file `\verb|config.h|'.
  4160 
  4161 Data sources can be created via the Administrative Tools from the
  4162 Control Panel.
  4163 
  4164 \bigskip
  4165 
  4166 To choose the ODBC table driver its name in the table statement should
  4167 be specified as \verb|'ODBC'| or \verb|'iODBC'|.
  4168 
  4169 The argument list is specified as follows.
  4170 
  4171 The first argument is the connection string passed to the ODBC library,
  4172 for example:
  4173 
  4174 \verb|'DSN=glpk;UID=user;PWD=password'|, or
  4175 
  4176 \verb|'DRIVER=MySQL;DATABASE=glpkdb;UID=user;PWD=password'|.
  4177 
  4178 Different parts of the string are separated by semicolons. Each part
  4179 consists of a pair {\it fieldname} and {\it value} separated by the
  4180 equal sign. Allowable fieldnames depend on the ODBC library. Typically
  4181 the following fieldnames are allowed:
  4182 
  4183 \verb|DATABASE | database;
  4184 
  4185 \verb|DRIVER   | ODBC driver;
  4186 
  4187 \verb|DSN      | name of a data source;
  4188 
  4189 \verb|FILEDSN  | name of a file data source;
  4190 
  4191 \verb|PWD      | user password;
  4192 
  4193 \verb|SERVER   | database;
  4194 
  4195 \verb|UID      | user name.
  4196 
  4197 The second argument and all following are considered to be SQL
  4198 statements
  4199 
  4200 SQL statements may be spread over multiple arguments.  If the last
  4201 character of an argument is a semicolon this indicates the end of
  4202 a SQL statement.
  4203 
  4204 The arguments of a SQL statement are concatenated separated by space.
  4205 The eventual trailing semicolon will be removed.
  4206 
  4207 All but the last SQL statement will be executed directly.
  4208 
  4209 For IN-table the last SQL statement can be a SELECT command starting
  4210 with the capitalized letters \verb|'SELECT '|. If the string does not
  4211 start with \verb|'SELECT '| it is considered to be a table name and a
  4212 SELECT statement is automatically generated.
  4213 
  4214 For OUT-table the last SQL statement can contain one or multiple
  4215 question marks. If it contains a question mark it is considered a
  4216 template for the write routine. Otherwise the string is considered a
  4217 table name and an INSERT template is automatically generated.
  4218 
  4219 The writing routine uses the template with the question marks and
  4220 replaces the first question mark by the first output parameter, the
  4221 second question mark by the second output parameter and so forth. Then
  4222 the SQL command is issued.
  4223 
  4224 The following is an example of the output table statement:
  4225 
  4226 \begin{small}
  4227 \begin{verbatim}
  4228 table ta { l in LOCATIONS } OUT
  4229    'ODBC'
  4230    'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword'
  4231    'DROP TABLE IF EXISTS result;'
  4232    'CREATE TABLE result ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );'
  4233    'INSERT INTO result 'VALUES ( 4, ?, ? )' :
  4234    l ~ LOC, quantity[l] ~ QUAN;
  4235 \end{verbatim}
  4236 \end{small}
  4237 
  4238 \noindent
  4239 Alternatively it could be written as follows:
  4240 
  4241 \begin{small}
  4242 \begin{verbatim}
  4243 table ta { l in LOCATIONS } OUT
  4244    'ODBC'
  4245    'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword'
  4246    'DROP TABLE IF EXISTS result;'
  4247    'CREATE TABLE result ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );'
  4248    'result' :
  4249    l ~ LOC, quantity[l] ~ QUAN, 4 ~ ID;
  4250 \end{verbatim}
  4251 \end{small}
  4252 
  4253 Using templates with `\verb|?|' supports not only INSERT, but also
  4254 UPDATE, DELETE, etc. For example:
  4255 
  4256 \begin{small}
  4257 \begin{verbatim}
  4258 table ta { l in LOCATIONS } OUT
  4259    'ODBC'
  4260    'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword'
  4261    'UPDATE result SET DATE = ' & date & ' WHERE ID = 4;'
  4262    'UPDATE result SET QUAN = ? WHERE LOC = ? AND ID = 4' :
  4263    quantity[l], l;
  4264 \end{verbatim}
  4265 \end{small}
  4266 
  4267 \subsection{MySQL table driver}
  4268 
  4269 The MySQL table driver allows connecting to MySQL databases.
  4270 
  4271 \paragraph{Debian GNU/Linux.}
  4272 Under Debian GNU/Linux the MySQL table\linebreak driver uses the MySQL
  4273 package,\footnote{For download development files see
  4274 {\tt<http://dev.mysql.com/downloads/mysql/>}.} which should be installed
  4275 before building the GLPK package. The installation can be effected with
  4276 the following command:
  4277 
  4278 \begin{verbatim}
  4279 sudo apt-get install libmysqlclient15-dev
  4280 \end{verbatim}
  4281 
  4282 Note that on configuring the GLPK package to enable using the MySQL
  4283 library the option `\verb|--enable-mysql|' should be passed to the
  4284 configure script.
  4285 
  4286 \paragraph{Microsoft Windows.}
  4287 Under Microsoft Windows the MySQL table driver also uses the MySQL
  4288 library. To enable this feature the symbol:
  4289 
  4290 \begin{verbatim}
  4291 #define MYSQL_DLNAME "libmysql.dll"
  4292 \end{verbatim}
  4293 
  4294 \noindent
  4295 should be defined in the GLPK configuration file `\verb|config.h|'.
  4296 
  4297 \bigskip
  4298 
  4299 To choose the MySQL table driver its name in the table statement should
  4300 be specified as \verb|'MySQL'|.
  4301 
  4302 The argument list is specified as follows.
  4303 
  4304 The first argument specifies how to connect the data base in the DSN
  4305 style, for example:
  4306 
  4307 \verb|'Database=glpk;UID=glpk;PWD=gnu'|.
  4308 
  4309 Different parts of the string are separated by semicolons. Each part
  4310 consists of a pair {\it fieldname} and {\it value} separated by the
  4311 equal sign. The following fieldnames are allowed:
  4312 
  4313 \verb|Server   | server running the database (defaulting to localhost);
  4314 
  4315 \verb|Database | name of the database;
  4316 
  4317 \verb|UID      | user name;
  4318 
  4319 \verb|PWD      | user password;
  4320 
  4321 \verb|Port     | port used by the server (defaulting to 3306).
  4322 
  4323 The second argument and all following are considered to be SQL
  4324 statements
  4325 
  4326 SQL statements may be spread over multiple arguments.  If the last
  4327 character of an argument is a semicolon this indicates the end of
  4328 a SQL statement.
  4329 
  4330 The arguments of a SQL statement are concatenated separated by space.
  4331 The eventual trailing semicolon will be removed.
  4332 
  4333 All but the last SQL statement will be executed directly.
  4334 
  4335 For IN-table the last SQL statement can be a SELECT command starting
  4336 with the capitalized letters \verb|'SELECT '|. If the string does not
  4337 start with \verb|'SELECT '| it is considered to be a table name and a
  4338 SELECT statement is automatically generated.
  4339 
  4340 For OUT-table the last SQL statement can contain one or multiple
  4341 question marks. If it contains a question mark it is considered a
  4342 template for the write routine. Otherwise the string is considered a
  4343 table name and an INSERT template is automatically generated.
  4344 
  4345 The writing routine uses the template with the question marks and
  4346 replaces the first question mark by the first output parameter, the
  4347 second question mark by the second output parameter and so forth. Then
  4348 the SQL command is issued.
  4349 
  4350 The following is an example of the output table statement:
  4351 
  4352 \begin{small}
  4353 \begin{verbatim}
  4354 table ta { l in LOCATIONS } OUT
  4355    'MySQL'
  4356    'Database=glpkdb;UID=glpkuser;PWD=glpkpassword'
  4357    'DROP TABLE IF EXISTS result;'
  4358    'CREATE TABLE result ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );'
  4359    'INSERT INTO result VALUES ( 4, ?, ? )' :
  4360    l ~ LOC, quantity[l] ~ QUAN;
  4361 \end{verbatim}
  4362 \end{small}
  4363 
  4364 \noindent
  4365 Alternatively it could be written as follows:
  4366 
  4367 \begin{small}
  4368 \begin{verbatim}
  4369 table ta { l in LOCATIONS } OUT
  4370    'MySQL'
  4371    'Database=glpkdb;UID=glpkuser;PWD=glpkpassword'
  4372    'DROP TABLE IF EXISTS result;'
  4373    'CREATE TABLE result ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );'
  4374    'result' :
  4375    l ~ LOC, quantity[l] ~ QUAN, 4 ~ ID;
  4376 \end{verbatim}
  4377 \end{small}
  4378 
  4379 Using templates with `\verb|?|' supports not only INSERT, but also
  4380 UPDATE, DELETE, etc. For example:
  4381 
  4382 \begin{small}
  4383 \begin{verbatim}
  4384 table ta { l in LOCATIONS } OUT
  4385    'MySQL'
  4386    'Database=glpkdb;UID=glpkuser;PWD=glpkpassword'
  4387    'UPDATE result SET DATE = ' & date & ' WHERE ID = 4;'
  4388    'UPDATE result SET QUAN = ? WHERE LOC = ? AND ID = 4' :
  4389    quantity[l], l;
  4390 \end{verbatim}
  4391 \end{small}
  4392 
  4393 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4394 
  4395 \newpage
  4396 
  4397 \section{Solving models with glpsol}
  4398 
  4399 The GLPK package\footnote{{\tt http://www.gnu.org/software/glpk/}}
  4400 includes the program {\tt glpsol}, which is a stand-alone LP/MIP solver.
  4401 This program can be launched from the command line or from the shell to
  4402 solve models written in the GNU MathProg modeling language.
  4403 
  4404 In order to tell the solver that the input file contains a model
  4405 description, you need to specify the option \verb|--model| in the
  4406 command line. For example:
  4407 
  4408 \medskip
  4409 
  4410 \verb|   glpsol --model foo.mod|
  4411 
  4412 \medskip
  4413 
  4414 Sometimes it is necessary to use the data section placed in a separate
  4415 file, in which case you may use the following command:
  4416 
  4417 \medskip
  4418 
  4419 \verb|   glpsol --model foo.mod --data foo.dat|
  4420 
  4421 \medskip
  4422 
  4423 \noindent Note that if the model file also contains the data section,
  4424 that section is ignored.
  4425 
  4426 If the model description contains some display and/or printf statements,
  4427 by default the output is sent to the terminal. In order to redirect the
  4428 output to a file you may use the following command:
  4429 
  4430 \medskip
  4431 
  4432 \verb|   glpsol --model foo.mod --display foo.out|
  4433 
  4434 \medskip
  4435 
  4436 If you need to look at the problem, which has been generated by the
  4437 model translator, you may use the option \verb|--wlp| as follows:
  4438 
  4439 \medskip
  4440 
  4441 \verb|   glpsol --model foo.mod --wlp foo.lp|
  4442 
  4443 \medskip
  4444 
  4445 \noindent in which case the problem data is written to file
  4446 \verb|foo.lp| in CPLEX LP format suitable for visual analysis.
  4447 
  4448 Sometimes it is needed merely to check the model description not
  4449 solving the generated problem instance. In this case you may specify
  4450 the option \verb|--check|, for example:
  4451 
  4452 \medskip
  4453 
  4454 \verb|   glpsol --check --model foo.mod --wlp foo.lp|
  4455 
  4456 \medskip
  4457 
  4458 In order to write a numeric solution obtained by the solver you may use
  4459 the following command:
  4460 
  4461 \medskip
  4462 
  4463 \verb|   glpsol --model foo.mod --output foo.sol|
  4464 
  4465 \medskip
  4466 
  4467 \noindent in which case the solution is written to file \verb|foo.sol|
  4468 in a plain text format.
  4469 
  4470 The complete list of the \verb|glpsol| options can be found in the
  4471 reference manual included in the GLPK distribution.
  4472 
  4473 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4474 
  4475 \newpage
  4476 
  4477 \section{Example model description}
  4478 
  4479 \subsection{Model description written in MathProg}
  4480 
  4481 Below here is a complete example of the model description written in
  4482 the GNU MathProg modeling language.
  4483 
  4484 \begin{small}
  4485 \begin{verbatim}
  4486 # A TRANSPORTATION PROBLEM
  4487 #
  4488 # This problem finds a least cost shipping schedule that meets
  4489 # requirements at markets and supplies at factories.
  4490 #
  4491 #  References:
  4492 #              Dantzig G B, "Linear Programming and Extensions."
  4493 #              Princeton University Press, Princeton, New Jersey, 1963,
  4494 #              Chapter 3-3.
  4495 
  4496 set I;
  4497 /* canning plants */
  4498 
  4499 set J;
  4500 /* markets */
  4501 
  4502 param a{i in I};
  4503 /* capacity of plant i in cases */
  4504 
  4505 param b{j in J};
  4506 /* demand at market j in cases */
  4507 
  4508 param d{i in I, j in J};
  4509 /* distance in thousands of miles */
  4510 
  4511 param f;
  4512 /* freight in dollars per case per thousand miles */
  4513 
  4514 param c{i in I, j in J} := f * d[i,j] / 1000;
  4515 /* transport cost in thousands of dollars per case */
  4516 
  4517 var x{i in I, j in J} >= 0;
  4518 /* shipment quantities in cases */
  4519 
  4520 minimize cost: sum{i in I, j in J} c[i,j] * x[i,j];
  4521 /* total transportation costs in thousands of dollars */
  4522 
  4523 s.t. supply{i in I}: sum{j in J} x[i,j] <= a[i];
  4524 /* observe supply limit at plant i */
  4525 
  4526 s.t. demand{j in J}: sum{i in I} x[i,j] >= b[j];
  4527 /* satisfy demand at market j */
  4528 
  4529 data;
  4530 
  4531 set I := Seattle San-Diego;
  4532 
  4533 set J := New-York Chicago Topeka;
  4534 
  4535 param a := Seattle     350
  4536            San-Diego   600;
  4537 
  4538 param b := New-York    325
  4539            Chicago     300
  4540            Topeka      275;
  4541 
  4542 param d :              New-York   Chicago   Topeka :=
  4543            Seattle     2.5        1.7       1.8
  4544            San-Diego   2.5        1.8       1.4  ;
  4545 
  4546 param f := 90;
  4547 
  4548 end;
  4549 \end{verbatim}
  4550 \end{small}
  4551 
  4552 \subsection{Generated LP problem instance}
  4553 
  4554 Below here is the result of the translation of the example model
  4555 produced by the solver \verb|glpsol| and written in CPLEX LP format
  4556 with the option \verb|--wlp|.
  4557 
  4558 \begin{small}
  4559 \begin{verbatim}
  4560 \* Problem: transp *\
  4561 
  4562 Minimize
  4563  cost: + 0.225 x(Seattle,New~York) + 0.153 x(Seattle,Chicago)
  4564  + 0.162 x(Seattle,Topeka) + 0.225 x(San~Diego,New~York)
  4565  + 0.162 x(San~Diego,Chicago) + 0.126 x(San~Diego,Topeka)
  4566 
  4567 Subject To
  4568  supply(Seattle): + x(Seattle,New~York) + x(Seattle,Chicago)
  4569  + x(Seattle,Topeka) <= 350
  4570  supply(San~Diego): + x(San~Diego,New~York) + x(San~Diego,Chicago)
  4571  + x(San~Diego,Topeka) <= 600
  4572  demand(New~York): + x(Seattle,New~York) + x(San~Diego,New~York) >= 325
  4573  demand(Chicago): + x(Seattle,Chicago) + x(San~Diego,Chicago) >= 300
  4574  demand(Topeka): + x(Seattle,Topeka) + x(San~Diego,Topeka) >= 275
  4575 
  4576 End
  4577 \end{verbatim}
  4578 \end{small}
  4579 
  4580 \subsection{Optimal LP solution}
  4581 
  4582 Below here is the optimal solution of the generated LP problem instance
  4583 found by the solver \verb|glpsol| and written in plain text format
  4584 with the option \verb|--output|.
  4585 
  4586 \newpage
  4587 
  4588 \begin{small}
  4589 \begin{verbatim}
  4590 Problem:    transp
  4591 Rows:       6
  4592 Columns:    6
  4593 Non-zeros:  18
  4594 Status:     OPTIMAL
  4595 Objective:  cost = 153.675 (MINimum)
  4596 
  4597 No.   Row name   St   Activity    Lower bound  Upper bound   Marginal
  4598 --- ------------ -- ------------ ------------ ------------ ------------
  4599   1 cost         B       153.675
  4600   2 supply[Seattle]
  4601                  B           300                       350
  4602   3 supply[San-Diego]
  4603                  NU          600                       600        < eps
  4604   4 demand[New-York]
  4605                  NL          325          325                     0.225
  4606   5 demand[Chicago]
  4607                  NL          300          300                     0.153
  4608   6 demand[Topeka]
  4609                  NL          275          275                     0.126
  4610 
  4611 No. Column name  St   Activity    Lower bound  Upper bound   Marginal
  4612 --- ------------ -- ------------ ------------ ------------ ------------
  4613   1 x[Seattle,New-York]
  4614                  B             0            0
  4615   2 x[Seattle,Chicago]
  4616                  B           300            0
  4617   3 x[Seattle,Topeka]
  4618                  NL            0            0                     0.036
  4619   4 x[San-Diego,New-York]
  4620                  B           325            0
  4621   5 x[San-Diego,Chicago]
  4622                  NL            0            0                     0.009
  4623   6 x[San-Diego,Topeka]
  4624                  B           275            0
  4625 
  4626 End of output
  4627 \end{verbatim}
  4628 \end{small}
  4629 
  4630 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4631 
  4632 \newpage
  4633 
  4634 \setcounter{secnumdepth}{-1}
  4635 
  4636 \section{Acknowledgment}
  4637 
  4638 The authors would like to thank the following people, who kindly read,
  4639 commented, and corrected the draft of this document:
  4640 
  4641 \medskip
  4642 
  4643 \noindent Juan Carlos Borras \verb|<borras@cs.helsinki.fi>|
  4644 
  4645 \medskip
  4646 
  4647 \noindent Harley Mackenzie \verb|<hjm@bigpond.com>|
  4648 
  4649 \medskip
  4650 
  4651 \noindent Robbie Morrison \verb|<robbie@actrix.co.nz>|
  4652 
  4653 \end{document}