Skip to content

Commit e48bfd8

Browse files
committed
Initial Commit of AEO-Public-Release
0 parents  commit e48bfd8

File tree

2,570 files changed

+1377176
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

2,570 files changed

+1377176
-0
lines changed

.gitattributes

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# Denote all files that are truly binary and should not be modified.
2+
# -text means not text aka binary
3+
# to track in kornshell cd to repo directory and type < git lfs track *xls
4+
*.dll filter=lfs diff=lfs merge=lfs -text
5+
*.dsn filter=lfs diff=lfs merge=lfs -text
6+
*.lib filter=lfs diff=lfs merge=lfs -text
7+
*.exe filter=lfs diff=lfs merge=lfs -text
8+
*.xlsx filter=lfs diff=lfs merge=lfs -text
9+
*.xls filter=lfs diff=lfs merge=lfs -text
10+
*.wk1 filter=lfs diff=lfs merge=lfs -text
11+
*.xml filter=lfs diff=lfs merge=lfs -text
12+
*.gdx filter=lfs diff=lfs merge=lfs -text
13+
*.mdb filter=lfs diff=lfs merge=lfs -text
14+
*.zip filter=lfs diff=lfs merge=lfs -text
15+
*.daf filter=lfs diff=lfs merge=lfs -text

.gitignore

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
objects/
2+
*.obj
3+
*.mod
4+
*.unf
5+
*.pdb
6+
scripts/backups
7+
scripts/backup_12_4
8+
source/backups
9+
p1/
10+
p2/
11+
p3/
12+
source/build/
13+
ERROR
14+
15+
16+
models/coal/log/*
17+
!models/coal/log/leave_blank.txt
18+
models/coal/toAIMMS/*
19+
!models/coal/toAIMMS/leave_blank.txt
20+
models/coal/fromAIMMS/*
21+
!models/coal/fromAIMMS/leave_blank.txt
22+
23+
models/ngas/ngsteo.txt
24+
models/ngas/ng_runval.txt
25+
models/ngas/spot_prc_diff.txt
26+
models/ngas/NGATTENTION.txt
27+
models/ngas/NGPRICES.txt
28+
models/ngas/data/NGSTEOFactors.txt
29+
models/ngas/mainproject/Main.DeveloperState
30+
models/ngas/mainproject/PageManager.xml
31+
models/ngas/mainproject/TemplateManager.xml
32+
models/ngas/mainproject/Pages/*
33+
models/ngas/mainproject/Settings/*
34+
models/ngas/mainproject/Templates/*
35+
models/ngas/mainproject/Tools/*
36+
models/ngas/mainproject/User*Files/*
37+
models/ngas/log/*
38+
!models/ngas/log/leave_blank.txt
39+
models/ngas/toAIMMS/*
40+
!models/ngas/toAIMMS/leave_blank.txt
41+
models/ngas/fromAIMMS/*
42+
!models/ngas/fromAIMMS/leave_blank.txt
43+
44+
models/rest/fromAIMMS/RETURNCODE.txt
45+
models/rest/log/*
46+
!models/rest/log/leave_blank.txt
47+
models/rest/monitor*.txt
48+
49+
models/efd/log/*
50+
!models/efd/log/leave_blank.txt
51+
52+
models/ecp/log/*
53+
!models/ecp/log/leave_blank.txt
54+
models/ecp/DLL_*.*
55+
models/ecp/OutToNEMS_*.txt
56+
models/ecp/monitor*.txt

analyze/!AIX.HLP

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
Function: Execute AIX command
2+
Syntax: !AIX command_string
3+
4+
Consult AIX manual.
5+
6+
Examples:
7+
!AIX ls
8+
...lists default directory.
9+
10+
! ls | more
11+
...lists default directory, using more for scrolling.

analyze/ACOMAND.RUL

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
* ACOMAND.RUL
2+
This tests ANALYZE command (from rule file). Spec is:
3+
$TEXT
4+
%%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9
5+
$TEXT
6+
$ANALYZE %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9
7+
$EXIT

analyze/ADDRIM.HLP

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
Function: Add rim elements of rows or columns
2+
Syntax: ADDRIM [{ROW | COL} [conditional]]
3+
4+
If ROW | COL is absent, current setting of switch DISP_COL is used.
5+
If conditional is absent, current submatrix is used.
6+
7+
Examples:
8+
9+
ADDRIM R *
10+
...Adds rim of all rows
11+
12+
ADDR C P STAT=B
13+
...Adds rim of all columns whose name begins with P and whose
14+
solution status (S) is Basic
15+
ADD C
16+
...Adds rim of columns in submatrix
17+
18+
ADDR R *NE S=LU Y=0
19+
...Adds rim of rows whose name has NE in positions 2-3, whose
20+
solution status is nobasic (at Lower bound or at Upper bound),
21+
and whose level (Y) is zero

analyze/AGGREGAT.DOC

Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
2+
AGGREGAT Command
3+
4+
The AGGREGAT command computes a price-weighted sum of the rows in the
5+
submatrix to produce the following single constraint (implied by
6+
those in the submatrix).
7+
8+
a <= Sum[j | p(j)X(j)] <= b,
9+
10+
where p(j) = Sum[i in submatrix | P(i)A(i,j)], and
11+
12+
P(i) = price of i-th row
13+
A(i,j) = matrix coefficient
14+
X(j) = level of j-th activity
15+
16+
The aggregate coefficient, p(j), shown with the output, is formed by
17+
a P-weighted sum of matrix coefficients, where P is is the dual price
18+
vector. Only the rows in the submatrix are used in forming p(j), but
19+
the aggregate constraint pertains to all columns.
20+
21+
The aggregate limits, a and b, are:
22+
23+
a = Sum[i IN I+ | P(i)L(i)] + Sum[i IN I- | P(i)U(i)]
24+
b = Sum[i IN I+ | P(i)U(i)] + Sum[i IN I- | P(i)L(i)],
25+
26+
where I+ = {i: P(i) > 0} and I- = {i: P(i) < 0}; and, L(i), U(i)
27+
are the (original) limits on row i. What this says is that if a
28+
price is negative, the row's inequalities are reversed in forming the
29+
aggregate range.
30+
31+
The primary purpose of the AGGREGAT command is when the LP is
32+
infeasible, in which case P(i) = 0 for i = objective row; however,
33+
the AGGREGAT command could be used for examining ranges of rows in an
34+
optimal solution. We shall separate these two uses of the AGGREGAT
35+
command after we present a fundamental derivation.
36+
37+
If the submatrix contains all rows, the aggregate coefficient, p(j) =
38+
P*A(j) (where A(j) includes the objective), equals minus the reduced
39+
cost of activity j -- that is, P*A(j) = -D(j). The aggregate
40+
constraint, therefore, is:
41+
42+
a <= y = Sum[j | -D(j)X(j)] <= b
43+
44+
and we require L <= X <= U. (The variable y is introduced here for
45+
notational convenience below.)
46+
47+
Infeasible Linear Program
48+
~~~~~~~~~~~~~~~~~~~~~~~~~
49+
Let us begin with the infeasible case. The output begins with a
50+
statement about the "required" range. This is [a, b] (where a = -*
51+
means negative infinity and b = * means positive infinity).
52+
53+
Then, the nonzero aggregate coefficients are listed (see Primer for
54+
discussions of WOODINFE and FOREST6, which are two infeasible linear
55+
programs that came with ANALYZE). The activities with nonzero
56+
aggregate coefficients, P*A(j), are put into the submatrix; and,
57+
those with zero (or nearly zero) coefficients are excluded from the
58+
submatrix. Thus, when AGGREGAT finishes, the columns in the
59+
submatrix are determined by the aggregation, over-riding whatever
60+
setting you had prior to the aggregation. It is possible for all
61+
coefficients to be zero, in which case there will be no columns in
62+
the submatrix.
63+
64+
After the coefficients are listed (if any), the "myopic range" is
65+
given. This is obtained by setting each variable to one of its bound
66+
values, depending upon the sign of its aggregate coefficient. That
67+
is, the range contribution from X(j) is determined as follows.
68+
69+
Suppose L(j) <= X(j) <= U(j), where L(j), U(j) are the (original)
70+
bounds on the level, X(j) (which could be infinite). Then, the range
71+
of the term, -D(j)X(j), is given by:
72+
73+
[D(j)*L(j), D(j)*U(j)] if D(j) > 0
74+
[D(j)*U(j), D(j)*L(j)] if D(j) < 0.
75+
76+
The bottom line myopic range of the aggregate row is the sum of the
77+
ranges of the terms. For an infeasible instance, with all rows in
78+
the submatrix, the myopic range is necessarily disjoint from the
79+
required range (displayed first). For example, if the required range
80+
is [a, b] and the myopic range is [c, d], it must be that d < a or c
81+
> b, so the required range can never be satisfied. This follows from
82+
the theory of linear programming if the resident solution prices
83+
represent a Phase I solution.
84+
85+
At a Phase I solution, the term, -D(j)X(j), has no direction of
86+
change in X(j) that reduces the infeasibility. The myopic range,
87+
given at the end of the output of the AGGREGAT command, reveals the
88+
range of the sum, which is disjoint from [a, b]. To aid
89+
infeasibility diagnosis, the real information is in which activities
90+
have nonzero aggregate coefficients.
91+
92+
Suppose the LP contains supplies and demands. If d < a, this
93+
suggests the aggregate demand requirement, y >= a, cannot be
94+
satisfied since the myopic range means y <= d in every solution
95+
satsifying L <= X <= U. In this case, look for activities in the
96+
output that limit the range from above (i.e., contributing to why d
97+
is so low, relative to a). If you find activities with positive
98+
coefficients, they will have limiting upper bounds, and if you find
99+
activities with negative coefficients, they will have limiting lower
100+
bounds. Sometimes, this provides enough information to form a
101+
diagnosis.
102+
103+
Similarly, if c > b, we require y <= b, but we have y >= c. This
104+
suggests a problem with the aggregate supply limit. The activities
105+
listed (if any) might be enough information to form a diagnosis of
106+
what went wrong.
107+
108+
To begin to understand how to use the AGGREGAT command to aid
109+
infeasibility diagnosis, apply it to WOODINFE (the other instance,
110+
FOREST6, is more complicated). Details of this reasoning can be
111+
found in the paper,
112+
113+
H.J. Greenberg, "An Empirical Analysis of Infeasible Instances
114+
of a Linear Programming Blending Model," IMA Journal of
115+
Mathematics Applied in Business & Industry 4 (1992), 163-210.
116+
117+
118+
Optimal Linear Program
119+
~~~~~~~~~~~~~~~~~~~~~~
120+
Now suppose the linear program has an optimal solution, which is
121+
resident. Then, the AGGREGAT command can be used to examine ranges
122+
of rows, for the particular aggregation by optimal prices.
123+
124+
To help gain insight, suppose all rows are in the submatrix, so the
125+
aggregate row is:
126+
127+
y = Sum[j | -D(j)X(j)].
128+
129+
Since the objective row is included, and it is a free row (i.e., L =
130+
-* and U = *), the required range is -* to *, as you will see (this
131+
does not occur in an infeasible instance because then the price for
132+
each free row, including the objective, is 0).
133+
134+
Now consider the myopic range. For j basic, D(j) = 0, so the sum is
135+
over nonbasic variables. At optimality, if X(j) = L(j), D(j) >= 0,
136+
so the range of the term, -D(j)X(j), is [-D(j)U(j), -D(j)L(j)].
137+
Similarly, if X(j) = U(j), D(j) <= 0, so the range is [-D(j)L(j),
138+
-D(j)U(j)]. Putting these together, the myopic range of the sum is:
139+
140+
y >= Sum[j: STAT(j) = L | -D(j)U(j)]
141+
+ Sum[j: STAT(j) = U | -D(j)L(j)]
142+
and
143+
y <= Sum[j: STAT(j) = L | -D(j)L(j)]
144+
+ Sum[j: STAT(j) = U | -D(j)U(j)]
145+
146+
If there is some activity, j, for which STAT(j) = L, D(j) > 0 and
147+
U(j) = *, it follows that y >= -*. This is typically what you will
148+
see as the lower bound on the myopic range.
149+
150+
Now examine the upper bound on y. It is "typical" that L >= 0 for
151+
each non-basic variable, so the upper bound on y is finite. In
152+
particular, if L = 0 and U = *, the upper bound is 0.
153+
154+
The meaning of this case, where our LP is the canonical form,
155+
156+
Minimize cx: x >= 0 and Ax >= b,
157+
158+
is that optimal prices weight the rows so that
159+
160+
0 = Max[-DX: X >= 0] = -Min[DX: X >= 0],
161+
162+
which states that the objective cannot be decreased from its current
163+
(optimal) level.
164+
165+
If you examine WOODNET, you will see another property, namely that
166+
the myopic range is -* to -min. This happens, not by coincidence,
167+
but because the LP is modeled with homogeneous equations. Its form
168+
is:
169+
170+
Minimize cx: L <= x <= U, Ax = 0,
171+
172+
where L >= 0. Supply limits appear as upper bounds on supply
173+
activities, and demand requirements appear as fixed levels, L = U > 0
174+
(which could also have U = * in an equivalent formulation). Since
175+
WOODNET is a network model, the homogeneous equations, Ax = 0,
176+
represent conservation of flows.
177+
178+
To see why y <= -min results in the myopic range, note that cx = Dx
179+
since the right-hand side is 0 (from the theory of linear
180+
programming, cx = Dx + Pb when LP is in standard form, where the
181+
constraints (except simple bounds on x) are equations, Ax = b).
182+
183+
Therefore, Dx >= min, or -Dx <= -min, which is what you see in the
184+
output for WOODNET.

analyze/AGGREGAT.HLP

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
Function: Display aggregation of rows in submatrix
2+
Syntax: AGGREGAT [{ROW | COL} [conditional]]
3+
4+
If ROW | COL is absent, current setting of switch DISP_COL is used.
5+
If conditional is absent, current submatrix is used.
6+
7+
Aggregation weights are the resident dual variables. This is
8+
useful if the LP is infeasible and the dual prices are optimal
9+
(unscaled) Phase 1 prices. In that case, the aggregation of all
10+
rows is a single infeasible constraint.
11+
12+
If rows are aggregated, columns with nonzero aggregate coefficients
13+
are put into the submatrix; and, columns with zero aggregate
14+
coefficients are excluded from the submatrix. (A similar result
15+
occurs for column aggregation.) See AGGREGAT.DOC (and primer) for
16+
more information.
17+
18+
Examples:
19+
20+
AGGREGAT R *
21+
...Aggregates all rows
22+
23+
AGG R
24+
...Aggregates rows in the submatrix
25+
26+
AGG C * X GT L
27+
...Aggregates columns whose level is greater than its lower bound

analyze/ANALYZE

1.57 MB
Binary file not shown.
113 KB
Binary file not shown.

0 commit comments

Comments
 (0)