lemon-project-template-glpk
comparison deps/glpk/doc/gmpl.tex @ 9:33de93886c88
Import GLPK 4.47
author | Alpar Juttner <alpar@cs.elte.hu> |
---|---|
date | Sun, 06 Nov 2011 20:59:10 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:b3a7e1565c4c |
---|---|
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$"ient 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} |