Skip to content

Commit 5f2050c

Browse files
mikebirchallaidanfar0
authored andcommitted
Added the TOM 478 algorithm L1
Added TOMS algorithm 478 "L1.f"
1 parent b83c30b commit 5f2050c

1 file changed

Lines changed: 221 additions & 0 deletions

File tree

L1.f

Lines changed: 221 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,221 @@
1+
C ALGORITHM 478 COLLECTED ALGORITHMS FROM ACM.
2+
C ALGORITHM APPEARED IN COMM. ACM, VOL. 17, NO. 06,
3+
C P. 319.
4+
SUBROUTINE L1(M,N,M2,N2,A,B,TOLER,X,E,S) A 010
5+
C THIS SUBROUTINE USES A MODIFICATION OF THE SIMPLEX METHOD
6+
C OF LINEAR PROGRAMMING TO CALCULATE AN L1 SOLUTION TO AN
7+
C OVER-DETERMINED SYSTEM OF LINEAR EQUATIONS.
8+
C DESCRIPTION OF PARAMETERS.
9+
C M NUMBER OF EQUATIONS.
10+
C N NUMBER OF UNKNOWNS (M.GE.N).
11+
C M2 SET EQUAL TO M+2 FOR ADJUSTABLE DIMENSIONS.
12+
C N2 SET EQUAL TO N+2 FOR ADJUSTABLE DIMENSIONS.
13+
C A TWO DIMENSIONAL REAL ARRAY OF SIZE (M2,N2).
14+
C ON ENTRY, THE COEFFICIENTS OF THE MATRIX MUST BE
15+
C STORED IN THE FIRST M ROWS AND N COLUMNS OF A.
16+
C THESE VALUES ARE DESTROYED BY THE SUBROUTINE.
17+
C B ONE DIMENSIONAL REAL ARRAY OF SIZE M. ON ENTRY, B
18+
C MUST CONTAIN THE RIGHT HAND SIDE OF THE EQUATIONS.
19+
C THESE VALUES ARE DESTROYED BY THE SUBROUTINE.
20+
C TOLER A SMALL POSITIVE TOLERANCE. EMPIRICAL EVIDENCE
21+
C SUGGESTS TOLER=10**(-D*2/3) WHERE D REPRESENTS
22+
C THE NUMBER OF DECIMAL DIGITS OF ACCURACY AVALABLE
23+
C (SEE DESCRIPTION).
24+
C X ONE DIMENSIONAL REAL ARRAY OF SIZE N. ON EXIT, THIS
25+
C ARRAY CONTAINS A SOLUTION TO THE L1 PROBLEM.
26+
C E ONE DIMENSIONAL REAL ARRAY OF SIZE M. ON EXIT, THIS
27+
C ARRAY CONTAINS THE RESIDUALS IN THE EQUATIONS.
28+
C S INTEGER ARRAY OF SIZE M USED FOR WORKSPACE.
29+
C ON EXIT FROM THE SUBROUTINE, THE ARRAY A CONTAINS THE
30+
C FOLLOWING INFORMATION.
31+
C A(M+1,N+1) THE MINIMUM SUM OF THE ABSOLUTE VALUES OF
32+
C THE RESIDUALS.
33+
C A(M+1,N+2) THE RANK OF THE MATRIX OF COEFFICIENTS.
34+
C A(M+2,N+1) EXIT CODE WITH VALUES.
35+
C 0 - OPTIMAL SOLUTION WHICH IS PROBABLY NON-
36+
C UNIQUE (SEE DESCRIPTION).
37+
C 1 - UNIQUE OPTIMAL SOLUTION.
38+
C 2 - CALCULATIONS TERMINATED PREMATURELY DUE TO
39+
C ROUNDING ERRORS.
40+
C A(M+2,N+2) NUMBER OF SIMPLEX ITERATIONS PERFORMED.
41+
DOUBLE PRECISION SUM
42+
REAL MIN, MAX, A(M2,N2), X(N), E(M), B(M)
43+
INTEGER OUT, S(M)
44+
LOGICAL STAGE, TEST
45+
C BIG MUST BE SET EQUAL TO ANY VERY LARGE REAL CONSTANT.
46+
C ITS VALUE HERE IS APPROPRIATE FOR THE IBM 370.
47+
! DATA BIG/1.E75/
48+
DATA BIG/1.E35/
49+
C INITIALIZATION.
50+
M1 = M + 1
51+
N1 = N + 1
52+
DO 10 J=1,N
53+
A(M2,J) = J
54+
X(J) = 0.
55+
10 CONTINUE
56+
DO 40 I=1,M
57+
A(I,N2) = N + I
58+
A(I,N1) = B(I)
59+
IF (B(I).GE.0.) GO TO 30
60+
DO 20 J=1,N2
61+
A(I,J) = -A(I,J)
62+
20 CONTINUE
63+
30 E(I) = 0.
64+
40 CONTINUE
65+
C COMPUTE THE MARGINAL COSTS.
66+
DO 60 J=1,N1
67+
SUM = 0.D0
68+
DO 50 I=1,M
69+
SUM = SUM + A(I,J)
70+
50 CONTINUE
71+
A(M1,J) = SUM
72+
60 CONTINUE
73+
C STAGE I.
74+
C DETERMINE THE VECTOR TO ENTER THE BASIS.
75+
STAGE = .TRUE.
76+
KOUNT = 0
77+
KR = 1
78+
KL = 1
79+
70 MAX = -1.
80+
DO 80 J=KR,N
81+
IF (ABS(A(M2,J)).GT.N) GO TO 80
82+
D = ABS(A(M1,J))
83+
IF (D.LE.MAX) GO TO 80
84+
MAX = D
85+
IN = J
86+
80 CONTINUE
87+
IF (A(M1,IN).GE.0.) GO TO 100
88+
DO 90 I=1,M2
89+
A(I,IN) = -A(I,IN)
90+
90 CONTINUE
91+
C DETERMINE THE VECTOR TO LEAVE THE BASIS.
92+
100 K = 0
93+
DO 110 I=KL,M
94+
D = A(I,IN)
95+
IF (D.LE.TOLER) GO TO 110
96+
K = K + 1
97+
B(K) = A(I,N1)/D
98+
S(K) = I
99+
TEST = .TRUE.
100+
110 CONTINUE
101+
120 IF (K.GT.0) GO TO 130
102+
TEST = .FALSE.
103+
GO TO 150
104+
130 MIN = BIG
105+
DO 140 I=1,K
106+
IF (B(I).GE.MIN) GO TO 140
107+
J = I
108+
MIN = B(I)
109+
OUT = S(I)
110+
140 CONTINUE
111+
B(J) = B(K)
112+
S(J) = S(K)
113+
K = K - 1
114+
C CHECK FOR LINEAR DEPENDENCE IN STAGE I.
115+
150 IF (TEST .OR. .NOT.STAGE) GO TO 170
116+
DO 160 I=1,M2
117+
D = A(I,KR)
118+
A(I,KR) = A(I,IN)
119+
A(I,IN) = D
120+
160 CONTINUE
121+
KR = KR + 1
122+
GO TO 260
123+
170 IF (TEST) GO TO 180
124+
A(M2,N1) = 2.
125+
GO TO 350
126+
180 PIVOT = A(OUT,IN)
127+
IF (A(M1,IN)-PIVOT-PIVOT.LE.TOLER) GO TO 200
128+
DO 190 J=KR,N1
129+
D = A(OUT,J)
130+
A(M1,J) = A(M1,J) - D - D
131+
A(OUT,J) = -D
132+
190 CONTINUE
133+
A(OUT,N2) = -A(OUT,N2)
134+
GO TO 120
135+
C PIVOT ON A(OUT,IN).
136+
200 DO 210 J=KR,N1
137+
IF (J.EQ.IN) GO TO 210
138+
A(OUT,J) = A(OUT,J)/PIVOT
139+
210 CONTINUE
140+
DO 230 I=1,M1
141+
IF (I.EQ.OUT) GO TO 230
142+
D = A(I,IN)
143+
DO 220 J=KR,N1
144+
IF (J.EQ.IN) GO TO 220
145+
A(I,J) = A(I,J) - D*A(OUT,J)
146+
220 CONTINUE
147+
230 CONTINUE
148+
DO 240 I=1,M1
149+
IF (I.EQ.OUT) GO TO 240
150+
A(I,IN) = -A(I,IN)/PIVOT
151+
240 CONTINUE
152+
A(OUT,IN) = 1./PIVOT
153+
D = A(OUT,N2)
154+
A(OUT,N2) = A(M2,IN)
155+
A(M2,IN) = D
156+
KOUNT = KOUNT + 1
157+
IF (.NOT.STAGE) GO TO 270
158+
C INTERCHANGE ROWS IN STAGE I.
159+
KL = KL + 1
160+
DO 250 J=KR,N2
161+
D = A(OUT,J)
162+
A(OUT,J) = A(KOUNT,J)
163+
A(KOUNT,J) = D
164+
250 CONTINUE
165+
260 IF (KOUNT+KR.NE.N1) GO TO 70
166+
C STAGE II.
167+
STAGE = .FALSE.
168+
C DETERMINE THE VECTOR TO ENTER THE BASIS.
169+
270 MAX = -BIG
170+
DO 290 J=KR,N
171+
D = A(M1,J)
172+
IF (D.GE.0.) GO TO 280
173+
IF (D.GT.(-2.)) GO TO 290
174+
D = -D - 2.
175+
280 IF (D.LE.MAX) GO TO 290
176+
MAX = D
177+
IN = J
178+
290 CONTINUE
179+
IF (MAX.LE.TOLER) GO TO 310
180+
IF (A(M1,IN).GT.0.) GO TO 100
181+
DO 300 I=1,M2
182+
A(I,IN) = -A(I,IN)
183+
300 CONTINUE
184+
A(M1,IN) = A(M1,IN) - 2.
185+
GO TO 100
186+
C PREPARE OUTPUT.
187+
310 L = KL - 1
188+
DO 330 I=1,L
189+
IF (A(I,N1).GE.0.) GO TO 330
190+
DO 320 J=KR,N2
191+
A(I,J) = -A(I,J)
192+
320 CONTINUE
193+
330 CONTINUE
194+
A(M2,N1) = 0.
195+
IF (KR.NE.1) GO TO 350
196+
DO 340 J=1,N
197+
D = ABS(A(M1,J))
198+
IF (D.LE.TOLER .OR. 2.-D.LE.TOLER) GO TO 350
199+
340 CONTINUE
200+
A(M2,N1) = 1.
201+
350 DO 380 I=1,M
202+
K = A(I,N2)
203+
D = A(I,N1)
204+
IF (K.GT.0) GO TO 360
205+
K = -K
206+
D = -D
207+
360 IF (I.GE.KL) GO TO 370
208+
X(K) = D
209+
GO TO 380
210+
370 K = K - N
211+
E(K) = D
212+
380 CONTINUE
213+
A(M2,N2) = KOUNT
214+
A(M1,N2) = N1 - KR
215+
SUM = 0.D0
216+
DO 390 I=KL,M
217+
SUM = SUM + A(I,N1)
218+
390 CONTINUE
219+
A(M1,N1) = SUM
220+
RETURN
221+
END

0 commit comments

Comments
 (0)