5 * Revision 1.1.1.1 1996/04/01 15:02:49 mclareni
10 #if defined(CERNLIB_DOUBLE)
11 SUBROUTINE DSMPLX(A,B,C,Z0,IDA,M,M1,N,N1,LW,IDW,W,X,Z,ITYPE)
13 #if !defined(CERNLIB_DOUBLE)
14 SUBROUTINE RSMPLX(A,B,C,Z0,IDA,M,M1,N,N1,LW,IDW,W,X,Z,ITYPE)
16 #include "gen/imp64.inc"
21 #if defined(CERNLIB_DOUBLE)
22 PARAMETER (NAME = 'DSMPLX')
24 #if !defined(CERNLIB_DOUBLE)
25 PARAMETER (NAME = 'RSMPLX')
27 PARAMETER (R10 = 10, IE0 = 15)
29 DIMENSION A(IDA,*),B(*),C(*),W(*),X(*),LW(IDW,*)
31 IF(M .LE. 0 .OR. N .LE. 0) THEN
33 CALL MTLPRT(NAME,'H101.1',ERRTXT)
36 IF(.NOT.(0 .LE. M1 .AND. M1 .LE. M .AND.
37 1 0 .LE. N1 .AND. N1 .LE. N)) THEN
38 WRITE(ERRTXT,102) M,N,M1,N1
39 CALL MTLPRT(NAME,'H101.2',ERRTXT)
47 EPSL=LOG10(2*EPS/(M*N))
49 IF(EPSL .LT. 0) IEXP=IEXP-1
55 IF(I .GT. M1) LW(I,1)=1
59 IF(K .GT. N1) LW(K,2)=-1
63 C LW(I,1), LW(K,2) = 0 x >= 0
64 C LW(I,1), LW(K,2) = -1 x = 0
65 C LW(I,1), LW(K,2) = 1 x unrestricted
66 C LW(I,1), LW(K,2) = 2 x linearly independent, no influence
67 C LW(I,1) = -2 x unrestricted, cannot be eliminated
69 C Elimination of the equality constraints from the basis
74 IF(LW(K,2) .EQ. -1) KP=K
77 C If KP = 0, no more equality constraints in the basis
82 IF(LW(I,1) .NE. -1) THEN
83 DMAX=MAX(ABS(A(I,KP)),DMAX)
84 IF(ABS(A(I,KP)) .EQ. DMAX) IP=I
87 IF(DMAX .LT. EPS) DMAX=0
89 IF(ABS(C(KP)) .LT. EPS) C(KP)=0
98 C Homogeneous part of at least 2 equ. is linearly dependent
99 C Inhomogeneous part is contradictory.
101 CALL H101S1(A,B,C,Z,M,N,IDA,IP,KP,LW,IDW,EPS)
108 C Non-basic variables only equation variables?
112 IF(LW(I,1) .NE. -1) IND=IND+1
115 C If non-basic variables only equation variables,
116 C is constraint violated?
121 IF(LW(K,2) .NE. 1) THEN
122 IF(ABS(C(K)) .LT. EPS) C(K)=0
127 IF(DMIN .LT. 0) ITYPE=4
132 C Eliminate unrestricted variables
134 IF(M1 .EQ. M) GO TO 200
137 IF(LW(I,1) .EQ. 1) IP=I
139 IF(IP .EQ. 0) GO TO 200
141 C If there are no free variables, or if they have been
142 C exchanged with equations, go to 200.
143 C Present tableau represents feasable initial solution?
148 IF(LW(K,2) .NE. 1) THEN
149 IF(ABS(C(K)) .LT. EPS) C(K)=0
155 IF(DMIN .GE. 0) IND=1
158 C If tableau represents an initial solution (IND = 1),
159 C elimination of remaining unrestricted variables.
164 IF(LW(K,2) .NE. 1) THEN
165 IF(ABS(A(IP,K)) .LT. EPS) A(IP,K)=0
166 DMAX=MAX(A(IP,K),DMAX)
167 IF(DMAX .EQ. A(IP,K)) KPMAX=K
168 DMIN=MIN(A(IP,K),DMIN)
169 IF(DMIN .EQ. A(IP,K)) KPMIN=K
172 IF(DMAX .NE. 0 .OR. DMIN .NE. 0) THEN
174 IF(ABS(B(IP)) .LT. EPS) B(IP)=0
175 IF(B(IP) .LT. 0 .AND. DMAX .GT. 0) THEN
178 IF(LW(K,2) .NE. 1 .AND. A(IP,K) .GT. 0) THEN
184 ELSEIF(B(IP) .GT. 0 .AND. DMIN .LT. 0) THEN
187 IF(LW(K,2) .NE. 1 .AND. A(IP,K) .LT. 0) THEN
193 ELSEIF(B(IP) .EQ. 0) THEN
194 Q=Q/MAX(DMAX,ABS(DMIN))
196 IF(LW(K,2) .NE. 1 .AND. A(IP,K) .NE. 0) THEN
205 IF(DMAX .LT. ABS(DMIN)) KP=KPMIN
207 CALL H101S1(A,B,C,Z,M,N,IDA,IP,KP,LW,IDW,EPS)
212 C If all pivot elements for free variable = 0, it has to
213 C remain out of the basis (LW(.,1) = -2).
219 C Feasable initial solution by mutiphase method.
221 200 IF(M1 .EQ. M .AND. N1 .EQ. N) GO TO 250
224 IF(LW(K,2) .EQ. 0) KP=KP+1
229 IF(LW(I,1) .NE. -1) IP=IP+1
240 IF(LW(I,1) .NE. -1) THEN
241 IF(ABS(B(I)) .LT. EPS) B(I)=0
242 L1=LW(I,1) .EQ. 0 .AND. B(I) .GT. 0
243 L2=LW(I,1) .EQ. 0 .AND. B(I) .EQ. 0
244 L3=LW(I,1) .EQ. 0 .AND. B(I) .LT. 0
245 L2=LW(I,1) .EQ. -2 .AND. B(I) .EQ. 0
246 L3=LW(I,1) .EQ. -2 .AND. B(I) .NE. 0
255 C Only unrestricted variables in the basis,
256 C hence final tableau obtained.
260 IF(LW(I,1) .EQ. 0) IP=IP+1
262 IF(IP .NE. 0) GO TO 250
265 IF(LW(K,2) .NE. 1) THEN
266 IF(ABS(C(K)) .LT. EPS) C(K)=0
277 IF(LW(I,1) .EQ. -2) IP=IP+1
287 IF(LW(I,1) .NE. -1) THEN
288 IF(ABS(B(I)) .LT. EPS) B(I)=0
297 C Variables out of the basis either unrestricted or 0,
298 C they cannot be exchanged, hence final tableau obtained.
300 C Tableau representing initial solution?
304 IF(LW(K,2) .NE. 1) THEN
305 IF(ABS(C(K)) .LT. EPS) C(K)=0
307 IF(C(K) .EQ. DMIN) KK=K
311 C All C(K) for constraints X >= 0, hence initial solution found.
312 C Otherwise column with index KK new objective function.
317 IF(LW(I,1) .EQ. 0) THEN
318 IF(ABS(A(I,KK)) .LT. EPS) A(I,KK)=0
319 DMIN=MIN(A(I,KK),DMIN)
320 IF(A(I,KK) .EQ. DMIN) IP=I
328 CALL H101S2(A,B,C,M,N,IDA,IP,KP,KK,LW,IDW,W,X,EPS,0)
330 CALL H101S1(A,B,C,Z,M,N,IDA,IP,KP,LW,IDW,EPS)
332 IF(ABS(C(KK)) .LT. EPS) C(KK)=0
333 IF(C(KK) .LT. 0) GO TO 270
337 C Initial solution found, hence algorithm may stop.
342 IF(LW(I,1) .EQ. -2) THEN
343 IF(ABS(B(I)) .LT. EPS) B(I)=0
352 C KASE = 1: There is a free variable out of the basis
353 C which does not influence the maximum (ITYPE = 2).
354 C Take out negative B(I).
358 IF(LW(I,1) .EQ. 0) THEN
359 IF(ABS(B(I)) .LT. EPS) B(I)=0
364 C All B(I) non-negative, hence final tableau obtained
368 CALL H101S2(A,B,C,M,N,IDA,IP,KP,0,LW,IDW,W,X,EPS,0)
373 CALL H101S1(A,B,C,Z,M,N,IDA,IP,KP,LW,IDW,EPS)
383 IF(LW(K,2) .EQ. 0) THEN
384 IF(ABS(C(K)) .LT. EPS) C(K)=0
394 IF(LW(I,1) .EQ. 0) THEN
395 IF(ABS(B(I)) .LT. EPS) B(I)=0
405 ELSEIF(KASE .EQ. 0) THEN
410 C Some C(K) = 0 and some B(I) = 0 in the final tableau.
414 IF(LW(I,1) .EQ. 2) THEN
417 IF(LW(K,2) .EQ. 2) THEN
418 IF(ABS(A(I,K)) .LT. EPS) A(I,K)=0
419 DMAX=MAX(A(I,K),DMAX)
429 IF(LW(K,2) .EQ. 2) THEN
432 IF(LW(I,1) .EQ. 2) DMIN=MIN(A(I,K),DMIN)
437 ELSEIF(DMIN .EQ. 0) THEN
439 IF(LW(I,1) .EQ. 2 .AND. A(I,K) .GT. 0) LW(I,1)=-2
447 IF(LW(K,2) .EQ. 2) NC=NC+1
451 IF(LW(I,1) .EQ. 2) THEN
456 IF(NR .EQ. 0 .OR. NC .EQ. 0) THEN
461 CALL H101S2(A,B,C,M,N,IDA,IP,KP,0,LW,IDW,W,X,EPS,2)
468 CALL H101S1(A,B,C,Z,M,N,IDA,IP,KP,LW,IDW,EPS)
476 101 FORMAT('M = ',I4,' OR N = ',I4,' ILLEGAL')
477 102 FORMAT('M = ',I4,', N = ',I4,': M1 = ',I4,' OR N1 = ',I4,