10.1007bf01783416-LPL-linear programming language
10.1007bf01783416-LPL-linear programming language
10.1007bf01783416-LPL-linear programming language
m
OR Spektrum (1993) 15:43-55
9 Springer-Verlag 1993
Received May 19, 1992/ Accepted in revised form October 21, 1992
Summary. This paper describes the new version of the mann and Kohlas 1988). The new version, exposed in this
modeling language, named LPL (Linear Programming paper, has been improved in several respects: A powerful
Language). It may be used to build, modify and document input and report generator has been integrated, the
mathematical models. The LPL language has been suc- expression syntax has been enlarged with several new
cessfully applied to generate automatically MPS input functions and operators, units can be used to measure
files and reports of large LP models. The available LPL numerical entities, restricted string manipulation is now
compiler translates LPL programs to the input code of possible, goal and multi-stage programming are also
any L P / M I P solver, calls the solver automatically, reads supported to some extent, and, finally, an open interface
the solution back to its internal representation, and the to most L P / M I P solver has been added. Many more
integrated Report Generator produces the user defined modifications and, hopefully, improvements have taken
reports of the model. Furthermore, an Input Generator place, but will not be mentioned here. A speciality of the
can read the data from many formats. old LPL version was its hierarchical indexing: Indices
were nested lists which could be used as any other index
Zusammenfassung. Dieser Artikel beschreibt die neue within a model. To use nested lists for indexing is very
Version der Modellierungssprache LPL (Linear Program- intriguing, since many sets of objects can be arranged as a
ming Language), die sich dazu eignet, mathematische tree in a natural way. Practical experiences, however, have
Modelle aufzubauen, zu warten und zu dokumentieren. shown that they obscured the model structure - at least in
Die LPL-Sprache wurde zum Erstellen yon MPS-Input- the form they have been implemented in LPL. Further-
Dateien und Resultate-Tabellen gr613erer LP-Modelle more, few modeling examples came around which used
erfolgreich eingesetzt. Der LPL-Compiler iibersetzt ein this option really. Many examples could be formulated
LPL-Programm, das ein vollst/indiges Modell reprfisen- more simply using relations. It was, therefore, decided to
tiert, in den Eingabecode eines LP/MIP-L6sungspro- drop hierarchical indexing from the LPL language. More
gramms, ruft den L6sungsalgorithmus auf, liest die L6- research work should be done, before hierarchical index-
sung, und ein integrierter Tabellengenerator gibt vom ing can be integrated in an advanced modeling language.
Benutzer definierte Resultate-Tabellen aus. Auf~erdem A first step in the right direction is (Bisschop 1991).
erlaubt ein Dateneingabe-Generator, die Daten in ver- Different modeling languages have recently been deve-
schiedenen Formaten zu lesen. loped. AMPL (Fourer et al. 1990), GAMS (Brooke et al.
1988), L I N G O (Schrage 1989), and SML (Geoffrion 1989)
Key words: Modeling, linear programming, compiler, are closest to the LPL language. These languages, and
MPS some others, have been compared in (Steiger and Sharda
1991). LPL has been updated since then and differs in
Schlfisselwiirter: Modellierung, lineare Programmierung, some respects from these other languages:
Compiler, MPS
9 LPL has an open interface to any L P / M I P solver. This
means that any linear solver can be called from within the
LPL code. The user can configure the communication
1. Introduction between LPL and the solver.
9 LPL contains input and report generator to read the
This paper presents the new version of the modeling data from files and to write the results to files. While
language LPL. A first version of LPL was developed and GAMS too includes a report generator only LPL has an
implemented some times ago. It was described in (Ht~rli- input generator. Actually, the input/report generator can
44 T. Hiirlimann: LPL
VAR {variables}
x(j) UNIT pieces; "quantity of bond purchased"
s(t) UNIT dollar; "cash susplus"
d(j) BINARY; "=i if bond is seleeted, else =0"
MODEL {constraints}
invest UNIT dollar: SUM(j) c*x + s[l];
Cash_bal(t[t>l) UNIT dollar: SUM(j) f*x + a'sit-l} - s - L;
C(j) UNIT pieces: x - q*d > = 0{pieces};
D(j) UNIT pieces: x - Q*d < - 0{pieces};
initS UNIT dollar: s[l] = 0{dollar};
Fig. 2
Fig. 3
46 T. Hfirlimann: LPL
SET j ; "bonds" Numerical data within the model are collected in coeffi-
cients. Its declaration is headed by the reserved word
The elements itselfs of this set are not defined at this place, COEF. The simplest coefficient consists of only one value:
they are part of the model data defined in file
M O D E L . D A T (Figs. 2-3). The modeler is, however, free COEF TMAX INTEGER [0,100];
to declare a set and to assign its elements at the same place
within the model. The set j could have been defined as T M A X is declared as a coefficient, but its value is not yet
known. The declaration, however, tells that TMAX must be
SET j = / A I : A S / ; " j is a set of five b o n d s " an integer value within the range [0,100]. The LPL
compiler tests these conditions and reports an error, if
The two elements A1 and A5 separated by a colon define a they are violated. L P L offers also the CHECK stament
range of elements, which is the same as which can check the data consistency using more complex
conditions. The instruction
SET j = /A1 A2 A3 A 4 AS/;
CHECK This(j) : q < Q ;
where every element is mentioned explicitly. The element- "q m u s t be s m a l l e r t h a n Q for e v e r y j",
names A1, ..., A5 might also be replaced by more
meaningful names as in checks for every q over j , if q is smaller than Q.
Coefficients can also be indexed, and their values are
SET j = /World_bank88 Treasury_bills collected in tables, c ( j ) is such a coefficient in our
S a n d o z _ b a b y EFF A T T 8 7 / ; example. It declares a marketprice c for every bond j. The
conditional minimum purchase quantity q and the allow-
Index-sets may be indexed, in which case they define a able purchase Q are also indexed over j. (Note that L P L
tuple-list of its indices. If the sets p and t are defined in the does not distinguish lower and upper-case letter by
following way (see Appendix A) default, but the directive {$ C} within a model instructs the
compiler to do so, therefore, q and Q are distinct in this
SET p : / P I : P I 8 0 /; model).
"a list of 180 p l a y e r s " The first table of Fig. 3 is a convenient way to define the
SET t = / T I : T I 5 /; setj together with the three coefficients c, q, and Q. This is
"a l i s t of 15 t e a m s " possible, because all three coefficients run over the indexj
only. This is, however, not the only way to enter the data.
then an indexed set M u s t _ b e _ i n can be specified as a list The modeler is free to declare and define the data within
of three elements the model structure as
T. Hiirlimann: LPL 47
SET j = /Al:A5/; optimizing function can be included within the list. The
COEF c ( j ) = [ 200 230 400 lO0 240 ]; restriction name is followed by a colon and a linear
COEF q(j) : [ I0 20 15 20 ] ; expression. Restrictions can also be indexed.
COEF Q(j) - [ 50 70 70 80 90 ]; The restriction
L P L offers different table formats for the data. But the MODEL B(j): x[j] - q[j]*d[j] >- 0;
most flexible way to get the data from external formats is
to use the input generator. is defined for every element of the setj. This generates as
Indexed coefficients are not restricted to only one- m a n y single restrictions as j has elements. Any algebraic
dimensional (with only one index) items. They can be two- expression is allowed as long as the expression is linear in
three- or higher-dimensional.f (j, t), for example, declares the variables. Summations begin with the reserved word
a two-dimensional coefficient, where the cash flow f is SUM. The term
defined for every b o u n d j within every time period t. D a t a
tables are reassignable. ... SUM(j) c[j]*x[j] ...
COEF a ~ I0; sums the product c*x over the set j. This is close the
"I0is a s s i g n e d to the c o e f f i c i e n t a" mathematical notation. The indices of c[j] and x[j] can
COEF b = a; also be dropped, if no ambiguities arise from the ex-
"the value of a is c o p i e d to b (lO)" pression.
COEF a = 20; This simplifies the term to
"a gets a n e w v a l u e 20,
the old one is erased, ... SUM(j) c*x ...
but b is still lO"
The declaration of restrictions can also be separated from
their definition. The declaration
3.3. Variables
Model
Variables have the same properties as coefficients. They Invest;
can also be defined as multidimensional objects and nu- "total b o u n d p u r c h a s e
merical values can be assigned to them. The only differ- and i n i t i a l cash i n v e s t m e n t "
ences are, that their declarations are headed by the reserved B a l a n c e ( t I t>l);
word 7AR and their values are usually assigned under the "cash b a l a n c e e q u a t i o n
solver's control. A typical variable declaration is in all p e r i o d s t>l"
C(j); O(j);
VAR x ( j ) ; "logical conditions"
"purchased quantity x of bound j".
is perfectly correct. The assignment of the restriction may
The variable x is declared o v e r j and may be interpreted as take place in a different model part. The reserved word
a numerical one-dimensional table of unknown values. M O D E L can also be replaced by the reserved word
But the modeler m a y also assign values to them. It is also E Q U A T I O N . But only the restrictions collected within
possible to restrict the values of the variables. Lower and the M O D E L statement make part of a model that is
upper bounds on variables are often used. Sometimes passed to the solver. This makes it possible - using the
variables must be integers. These options can be added to solver statement ( M I N I M I Z E or M A X I M I Z E ) at several
any variable declaration as in places within the model - to call the solver repeatedly
within a LPL model with different model variants.
VAR d(j) INTEGER; Another useful application of this option is multi-goal
programming.
The declaration of d declares a variable over set j. If the The objective function begins with the reserved word
reserved word INTEGER is replaced by B O O L E A N or M I N I M I Z E or M A X I M I Z E , depending whether the
L O G I C A L , its values can only be the integers 0 or 1. These function is minimized or maximized. This instruction calls
restrictions are automatically translated by the L P L directly the solver.
compiler as B O U N D S and I N T - M A R K E R S in the
B O U N D - und COLUMN-Section of the MPS input-code
for the L P / M I P solver (see any OR text-book for more 3.5. The solver
details of the MPS code).
LPL has no integrated solver, but can call an external
solver automatically. The interface between most avail-
3.4. The model able L P / M I P solvers and LPL can even be specified by the
modeler. The c o m m a n d MINIMIZE or MAXIMIZE in-
The model restrictions are declared in the M O D E L structs the L P L compiler to produce the MPS file, the
statement. Each restriction begins with a name. The standard solver input file, then to call the solver itself with
48 T. Hiirlirnann: LPL
the right parameters, and to read the solution back to the this one may add the unit expression as following
LPL internal data structure. The interface is explained in
detail in the reference manual (Htirlimann 1992). By PRINT invest UNIT 1000*dollar;
default, the interface to the XA solver is "hardwired"
within the LPL compiler, but other solver packages such But note that units are optional. The modeler may or may
as OSL, Cplex, MOPS or LINDO work too. not use them within his model.
The different parts of an LPL model have now been
described very briefly. Some aspects will be explained in
3. 6. Reports greater detail in the subsequent sections. Most examples
are from the model in Appendix A.
LPL does not only to formulate a complete model, but can
also produce model reports. This is integrated part of
LPL. The reserved word PRINT is used to generate even 4. The use of indices
most complex reports. The simplest reports are generated
using the syntax shown in Fig. 2 as The indices are used to define multi-dimensional items,
such as coefficient, variables, restrictions, or indexed sets.
PRINT Invest; x; s; d; The are called tables.
not possible. (By default LPL will bind it to the last, but 9 to evaluate and to output intermediate expressions and
this may be implementation dependent). tables
Binding is flexible in LPL. It is, however, necessary 9 to declare sparse, indexed tables.
that the bound and the binding indices represent the same
Expressions are built using the usual mathematical no-
index-set. An expression such as
tation with arithmetical (+ - */^ ) and logical (and, or, not)
operators, coefficients, numbers and functions (Fig. 5).
COEF a(i,j) = b[i,k]; "bound error!"
p r o d u c e s a n e r r o r . It m u s t b e r e p l a c e d by
sin, log, . . . functions
COEF a ( i , j ) = b[i,j IN k ] ; "correct" + - not#IN unary operators
A power
j IN k returns the position of a specific element of/within */% p r o d u c t and d i v i s i o n
the set k. (In this case, k is regarded as an ordered set). If sum, prod,.., index-operators
the specific element o f j is not in k, the whole expression + - a d d i t i o n and s u b t r a c t i o n
-<><><= >= ~ relational operators
b [ i , j IN k ] returns zero. If the intersection o f j and k is
and l o g i c a l AND
a real subset of k, then the table a will be filled up only or logical OR
partially by the assignment, the rest of the table a will , (or I) enumeration operator
remain unchanged.
In general, the LPL compiler tries to bind the passive Fig. 4. Operators
indices automatically, identified by their names. The
modeler, however, has the possibility to force any binding
using dummy-indices. The corresponding, active indices
must be headed be a dummy-index, followed be an equal max(x,y) returns x, if x>y, else r e t u r n s y
sign or the IN reserved word. min(x,y) returns x, if x<y, else r e t u r n s y
abs(x) returns the a b s o l u t e value of x
ceil(x) returns next integer g r e a t e r than x
COEF a ( d l = i , d B = j ) = b[dl,dE]; floor(x) returns next integer less than x
COEF a ( d l IN i,d2 IN j) = b[dl,dB]; trunc(x) returns the t r u n c a t e d x
"the same" sin(x) returns the sinus of x
cos(x) returns the cosines of x
The dummy-indices d l and d2 can then be used instead of log(x) returns the nat. l o g a r i t h m of x
sqrt(x) returns the root of x
the passive indices within the expressions. This forces the rnd(x,y) returns a uniform distributed number
binding from d l to i and from d2 to j . Every active rndn(x,y) returns a normal distributed number
index within an LPL model can be extended by a dummy. if(x,y,z) returns y, if x is TRUE, else r e t u r n s z
The same dummies may be used in different expressions,
since they have only local effect. (They are really treated Fig. 5. Functions
like local variables in programming languages). In some
situations dummies are necessary, but in most contexts
they may be dropped. It is a matter of style, whether the
modeler wants to use them systematically or not. LPL SUM(i) a[i] sum all a over i
PROD(i) a[i] m u l t i p l y all a over i
even makes it possible to drop all passive indices, if they SMIN(i) a[i] the s m a l l e s t a[i]
can be bound uniquely. Since this relaxed use of indices SMAX(i) a[i] the b i g g e s t a[i]
within LPL models might be dangerous, LPL also offers a EXIST(i) a[i] tests, w h e t h e r all a[i] is FALSE
compiler switch, which restricts this practice (Hiirlimann FORALL(i) a[i] tests, w h e t h e r all a[i] are TRUE
1992, p 69). PMAX(i) a[i] p o s i t i o n i of the b i g g e s t a[i]
Indices can also be used as terms within expressions. In PMIN(i) a[i] p o s i t i o n i of the s m a l l e s t a[i]
COL(i) . . . horizontal table-expander
this case, they return the position of an element within the
ROW(i) ... vertical table-expander
index-set. The expression
Fig. 6. Index-operators
COEF a(i) = i,
The same syntax may be used for the iteration process PRINT : a ' b : 1 2 ;
of the index-operators too. An example is the following " o u t p u t a v a l u e on 12 p o s i t i o n s "
expression: Sum the values of the table a(i), such that PRINT(j,i) : a[i,j];
i<=5 "output the t r a n s p o s e d m a t r i x a"
PRINT : ' t h i s text';
SUM(i I i < = 5) a [ i ] ; "output a text line"
PRINT(j) : SUM(i) a[i,j],
The portfolio model used this option in the C a s h _ b a l "output the column totals of a"
constraints
The reserved word PRINT is followed by an index-list, if
MODEL C a s h _ b a l ( t ] t > l ) : the expression is indexed.
SUM(j) f * x + a * s [ t - 1 ] - s - L;
This constraint is only defined for t > l , but will not be 6.2. Masks
produced for the period t = l . Another example is the
restrictin Must in the soccer model of Appendix A For more complex layouts, the modeler can define a
layout mask through a Mask statement. The Mask
Must(p,t ] Must_be_in): Work - i; statement is headed by the reserved word MASK an a
mask-name. This is followed by the content of the mask,
which would produce 2700 (= 180 • 15) single restrictions which extends to the reserved word ENDMASK. The
without the condition Mus t _ b e _ i n , but produces actu- content of the mask may be any string of characters. The
ally only the following three constraints two characters # and $, however, have a special signifi-
cation and are called place-holder. They are replaced by
Mustl: Work[P1,T2]-I the numerical or string expressions of subsequent Print
Must2: Work[PE,T6]-I statement. Example
Must3: Work[P3,T7]-i
MASK ml " ' m l ' is the mask-name"
since M u s t _ b e _ i n is defined as Month: $$$$$$$$ : ####.##~ #####.####gallons
ENDMASK
SET Must_be_in(p,t) = / P I T 2 , P 2 T 6 , P 3 T 7 / ; PRINT ml ('April', 17.15"2, 2378.567321);
which is an indexed set containing three tuples. These two statements produce the following output
Results per t e a m
T1 P9 P41 P49 P57 PT0 P71 P86 P89 Pll8 P143 P145 P154
T2 P1 P6 P7 P22 P23 P48 P52 P55 P92 P133 P149 P162
T3 P38 P39 P54 P56 P91 P93 P97 Pll9 PI41 P142 P174 P180
T4 P20 P51 P73 P78 P80 P84 P88 PI03 PI07 Pig1 P156 P157
T5 P21 P42 P63 P75 P82 Pl00 PI02 P105 P134 P148 P175 P178
T6 P2 P3 P4 P8 P35 P47 P68 P69 P81 P85 P98 P146
T7 P24 P28 P34 P45 P58 P59 P87 P121 P126 P135 P140 P151
T8 PlO P16 P18 P19 P64 Pl08 Pl09 Plll P147 P160 P171 P173
T9 P30 P36 P37 P40 P62 P83 P90 P130 P132 P150 P158 P179
TIO P15 P46 P72 P76 P96 Pll2 Pll4 P124 P127 P137 P166 P172
Tll P5 P33 P53 P94 P120 P123 P138 P153 P155 P159 P167 P177
T12 P12 P13 P25 P26 P29 P32 P44 P50 P77 P95 PlO1 P136
T13 Pll P14 P17 P27 P65 P79 P128 P139 P144 P152 P161 P163
T14 P31 P43 P60 P67 P74 P106 Pl13 Pll5 P122 P125 P170 P176
T15 P61 P66 P99 PI04 Pll0 Pll6 Pll7 P129 P164 P165 P168 P169
Fig. 7
expression COL ( t ]work ) t runs over all t for a specificp The first place-holder is filled by the team name t, the next
and outputs all team names t horizontally for every by the total skill per team, calculated by the expression
w o r k ] p , t ] that is TRUE. Since a player p can only in SUM ( p Iwork ) S k i 1 1 . The next are calculated similarly.
one team, this outputs only one team name per line. The last two place-holders in line 16 are filled by the
Because the whole expression is also defined over expression
R 0 W ( p ) , the output of this line is repeated for every
playerp, which will produce 180 lines in our case. The next ROW(t) (t, COL(plwork) p)
five place-holder are defined on line 9 of the mask. They
are filled by the expression Note that this simple line produce a whole two dimen-
sional table. The players are collected per line. The
ROW(t) (t, S U M ( p l w o r k ) Skill, iteration of the ROW and COL index-operators can also
SUM(plwork) Age, be restricted by a condition. This allows us to select any
(Sum(plwork) Skill)/12, subset of tables and to output the result in most complex
(SUM(plwork) Age)/12), layouts.
T. Htirlimann: LPL 53
6.3. The input generator new line. COL(), too repeats to read tokens on the same
line, until the line ends.
The Input Generator is represented by the Read state- It is also possible to read from different files. The three
ment. It is similar to the Print statement, but instead of tables could have been divided into three files. In this case
output data, it allows to read data from files. As an no block indication would be necessary. The Input
example, suppose the data of the portfolio model in Fig. 3 Generator has several nice features. One is the following:
are not organized in LPL syntax, but in a plain text file empty lines or lines containing only separators between
shown in Fig. 8. tokens, such as spaces or tabs, or lines beginning with a
dot are skipped automatically. First experiences with the
input generator are promising: For an LP model with 1300
constraints and 1500 variables, a Pascal program of 32
A d a t a set of t h e p o r t f o l i o model: file PORTDATA
Three tables are defined
pages bad been written to manipulate the data; using the
new LPL input generator, it is now possible to code the
Table 1: bond data same program in 2 pages (Hiirlimann 1991).
bond pice min. pur- max p u r -
name chase quan. chase quan.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7. Conclusion
A1 2 10 500
A2 2.3 700
A3 4 700 This paper is a brief report of the new version of the LPL
A4 1 15 800 modeling language. The reference manual (H[lrlimann
A5 2.4 20 900 1992) gives a detailed description of the language. A
Endtable 1 model library of about 60 examples written in LPL is
available.
T a b l e 2: period data
period cash avail. reinvestment The development of LPL was motivated by practical
use. Different models with 1500-2000 restrictions, 2000-
T1 - - 3500 variables, and a matrix density of 7500-12000 non-
T2 12000 90 % zero elements are under continuous use and development
T3 14000 80 % at the Institute (H/ittenschwiler and Kohlas 1989). Most of
T4 5000 80 %
them are formulated in LPL. Until very recently, these
Endtable 2
models had to be solved by a solver package on a main-
Table 3: cash flow frame computer. Therefore, the important task of the LPL
T1 T2 T3 T4 was to produce the solver input file. The hardware of the
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
SET
t; "the list of teams"
P; "the list of p l a y e r s "
must_be_in(p,t); " p l a y e r s p must be in t e a m t "
reject_from(p,t); "player p is r e j e c t e d from a t e a m t"
t_groups(p,p); "groups of p l a y e r s w h i c h must be t o g e t h e r in a team"
n_groups(p,p); "groups of p l a y e r s w h i c h must n e v e r be t o g e t h e r "
MODEL
" m a x i m i z e the a s s i g n m e n t "
obj: SUM(p, t) work;
" p l a y e r p must be only in one team"
B o u n d s ( p ) : SUM(t) w o r k = I;
"total skill level of t e a m t must be at least 59"
Skill_level(t): SUM(p) w o r k * Skill > = 59;
"total p l a y e r count per t e a m t must be 12"
H e a d s ( t ) : SUM(p) w o r k = 12;
"total t e a m age of t e a m t must be at least 124"
Team_age(t): SUM(p) w o r k * age > = 124;
" p l a y e r p m u s t be in t e a m t"
Must (i=must_be_in): w o r k [ i ] = i;
"player p is r e j e c t e d from a t e a m t"
Reject (i=reject_from): w o r k [ i ] = 0;
" p l a y e r s w h i c h must be in the same team"
Same(t,t_groups[i,j]): w o r k [ i , j ] - w o r k [ j , t ] = 0;
" p l a y e r s w h i c h m u s t not be in the same team"
Never(t,i=p lexist(j=p)n_groups[i,j]): work[j,t]<=l;
MAXIMIZE obj;
M A S K ml
T. Hgrlimann: LPL 55
work(p, t) has only the values 1 or 0, depending whether Geoffrion AM (1989) SML: a model definition language for
the player p is assigned to team t. The model has been structured modeling. Western Management Science Institute,
solved on a PC 80386 with a C o p r o c e s s o r and 4 MB R A M University of California, Los Angeles, Working Paper No. #360,
revised Nov. 1989
with X A 386 in 3 0 m i n - we have been lucky, since the
Greenberg HJ (1990) A primer of ANALYSE: a computer-assisted
model is a pure 0-1 IP (integer program). analysis system for mathematical programming models and
solutions. University of Colorado, Denver, Draft, June 28
Hgttenschwiler P, Kohlas J (1989) Wissensbasierte Systeme auf der
Grundlage linearer Modelle - Werkzeuge und Anwendungen.
Output 18(12):21-28
References Hfirlimann T, Kohlas J (1988) LPL: A structured language for linear
modeling. OR Spectrum 10:55-63
Bischop J J, Kuip CAC (1991) Hierarchical sets in mathematical Htirlimann T (1991) The input and report generator in LPL.
programming modeling languages. Working Paper, Department Institute for Automation and Operations Research, Working
of Applied Mathematics, University of Twente, The Netherlands Paper No. 190, September, Fribourg (updated April 1992)
Brooke A, Kendrick D, Meeraus A (1988) GAMS. A user's guide. Htirlimann T (1992) Reference manual for the LPL modeling
Scientific Press, language. Version 3.8, Institute for Automation and Operations
Cunningham K, Schrage L (1989) The LINGO modeling language. Research, Working Paper No. 191, September 1991, updated
University of Chicago, Preliminary, 27 February February 1992, Fribourg
Dolk DR (1988) Model management and structured modeling: the Shapiro JF (1988) Stochastic programming models for dedicated
role of an information resource dictionary system. Commun portfolio selection. In: Mitra G (ed) Mathematical models for
ACM 31:704-718 decision support (NATO ASI Ser. F, vol 48, pp587-611).
Fourer R, Gay DM, Kernighan BW (1990) A modeling language for Springer, Berlin Heidelberg New York
mathematical programming. Manage Sci 36(5): 519-554 Steiger D, Sharda R (1991) LP modeling languages for personal
Gass SI (1984) Documenting a computer-based model. Interfaces computers: a comparison. Working Paper 90-27, College of
14:84-93 Business Administration, Oklahoma State University