Mercurial > hg > octave-nkf
view libcruft/fsqp/ql0002.f @ 2512:fda09c1e787e
[project @ 1996-11-14 08:39:41 by jwe]
author | jwe |
---|---|
date | Thu, 14 Nov 1996 08:39:47 +0000 |
parents | 30c606bec7a8 |
children |
line wrap: on
line source
C SUBROUTINE QL0002(N,M,MEQ,MMAX,MN,MNN,NMAX,LQL,A,B,GRAD,G, 1 XL,XU,X,NACT,IACT,MAXIT,VSMALL,INFO,DIAG,W,LW) C C************************************************************************** C C C THIS SUBROUTINE SOLVES THE QUADRATIC PROGRAMMING PROBLEM C C MINIMIZE GRAD'*X + 0.5 * X*G*X C SUBJECT TO A(K)*X = B(K) K=1,2,...,MEQ, C A(K)*X >= B(K) K=MEQ+1,...,M, C XL <= X <= XU C C THE QUADRATIC PROGRAMMING METHOD PROCEEDS FROM AN INITIAL CHOLESKY- C DECOMPOSITION OF THE OBJECTIVE FUNCTION MATRIX, TO CALCULATE THE C UNIQUELY DETERMINED MINIMIZER OF THE UNCONSTRAINED PROBLEM. C SUCCESSIVELY ALL VIOLATED CONSTRAINTS ARE ADDED TO A WORKING SET C AND A MINIMIZER OF THE OBJECTIVE FUNCTION SUBJECT TO ALL CONSTRAINTS C IN THIS WORKING SET IS COMPUTED. IT IS POSSIBLE THAT CONSTRAINTS C HAVE TO LEAVE THE WORKING SET. C C C DESCRIPTION OF PARAMETERS: C C N : IS THE NUMBER OF VARIABLES. C M : TOTAL NUMBER OF CONSTRAINTS. C MEQ : NUMBER OF EQUALITY CONTRAINTS. C MMAX : ROW DIMENSION OF A, DIMENSION OF B. MMAX MUST BE AT C LEAST ONE AND GREATER OR EQUAL TO M. C MN : MUST BE EQUAL M + N. C MNN : MUST BE EQUAL M + N + N. C NMAX : ROW DIEMSION OF G. MUST BE AT LEAST N. C LQL : DETERMINES INITIAL DECOMPOSITION. C LQL = .FALSE. : THE UPPER TRIANGULAR PART OF THE MATRIX G C CONTAINS INITIALLY THE CHOLESKY-FACTOR OF A SUITABLE C DECOMPOSITION. C LQL = .TRUE. : THE INITIAL CHOLESKY-FACTORISATION OF G IS TO BE C PERFORMED BY THE ALGORITHM. C A(MMAX,NMAX) : A IS A MATRIX WHOSE COLUMNS ARE THE CONSTRAINTS NORMALS. C B(MMAX) : CONTAINS THE RIGHT HAND SIDES OF THE CONSTRAINTS. C GRAD(N) : CONTAINS THE OBJECTIVE FUNCTION VECTOR GRAD. C G(NMAX,N): CONTAINS THE SYMMETRIC OBJECTIVE FUNCTION MATRIX. C XL(N), XU(N): CONTAIN THE LOWER AND UPPER BOUNDS FOR X. C X(N) : VECTOR OF VARIABLES. C NACT : FINAL NUMBER OF ACTIVE CONSTRAINTS. C IACT(K) (K=1,2,...,NACT): INDICES OF THE FINAL ACTIVE CONSTRAINTS. C INFO : REASON FOR THE RETURN FROM THE SUBROUTINE. C INFO = 0 : CALCULATION WAS TERMINATED SUCCESSFULLY. C INFO = 1 : MAXIMUM NUMBER OF ITERATIONS ATTAINED. C INFO = 2 : ACCURACY IS INSUFFICIENT TO MAINTAIN INCREASING C FUNCTION VALUES. C INFO < 0 : THE CONSTRAINT WITH INDEX ABS(INFO) AND THE CON- C STRAINTS WHOSE INDICES ARE IACT(K), K=1,2,...,NACT, C ARE INCONSISTENT. C MAXIT : MAXIMUM NUMBER OF ITERATIONS. C VSMALL : REQUIRED ACCURACY TO BE ACHIEVED (E.G. IN THE ORDER OF THE C MACHINE PRECISION FOR SMALL AND WELL-CONDITIONED PROBLEMS). C DIAG : ON RETURN DIAG IS EQUAL TO THE MULTIPLE OF THE UNIT MATRIX C THAT WAS ADDED TO G TO ACHIEVE POSITIVE DEFINITENESS. C W(LW) : THE ELEMENTS OF W(.) ARE USED FOR WORKING SPACE. THE LENGTH C OF W MUST NOT BE LESS THAN (1.5*NMAX*NMAX + 10*NMAX + M). C WHEN INFO = 0 ON RETURN, THE LAGRANGE MULTIPLIERS OF THE C FINAL ACTIVE CONSTRAINTS ARE HELD IN W(K), K=1,2,...,NACT. C THE VALUES OF N, M, MEQ, MMAX, MN, MNN AND NMAX AND THE ELEMENTS OF C A, B, GRAD AND G ARE NOT ALTERED. C C THE FOLLOWING INTEGERS ARE USED TO PARTITION W: C THE FIRST N ELEMENTS OF W HOLD LAGRANGE MULTIPLIER ESTIMATES. C W(IWZ+I+(N-1)*J) HOLDS THE MATRIX ELEMENT Z(I,J). C W(IWR+I+0.5*J*(J-1)) HOLDS THE UPPER TRIANGULAR MATRIX C ELEMENT R(I,J). THE SUBSEQUENT N COMPONENTS OF W MAY BE C TREATED AS AN EXTRA COLUMN OF R(.,.). C W(IWW-N+I) (I=1,2,...,N) ARE USED FOR TEMPORARY STORAGE. C W(IWW+I) (I=1,2,...,N) ARE USED FOR TEMPORARY STORAGE. C W(IWD+I) (I=1,2,...,N) HOLDS G(I,I) DURING THE CALCULATION. C W(IWX+I) (I=1,2,...,N) HOLDS VARIABLES THAT WILL BE USED TO C TEST THAT THE ITERATIONS INCREASE THE OBJECTIVE FUNCTION. C W(IWA+K) (K=1,2,...,M) USUALLY HOLDS THE RECIPROCAL OF THE C LENGTH OF THE K-TH CONSTRAINT, BUT ITS SIGN INDICATES C WHETHER THE CONSTRAINT IS ACTIVE. C C C AUTHOR: K. SCHITTKOWSKI, C MATHEMATISCHES INSTITUT, C UNIVERSITAET BAYREUTH, C 8580 BAYREUTH, C GERMANY, F.R. C C AUTHOR OF ORIGINAL VERSION: C M.J.D. POWELL, DAMTP, C UNIVERSITY OF CAMBRIDGE, SILVER STREET C CAMBRIDGE, C ENGLAND C C C REFERENCE: M.J.D. POWELL: ZQPCVX, A FORTRAN SUBROUTINE FOR CONVEX C PROGRAMMING, REPORT DAMTP/1983/NA17, UNIVERSITY OF C CAMBRIDGE, ENGLAND, 1983. C C C VERSION : 2.0 (MARCH, 1987) C C C************************************************************************* C INTEGER MMAX,NMAX,N,LW DIMENSION A(MMAX,NMAX),B(MMAX),GRAD(N),G(NMAX,N),X(N),IACT(N), 1 W(LW),XL(N),XU(N) INTEGER M,MEQ,MN,MNN,NACT,IACT,INFO,MAXIT DOUBLE PRECISION CVMAX,DIAG,DIAGR,FDIFF,FDIFFA,GA,GB,PARINC,PARNEW 1 ,RATIO,RES,STEP,SUM,SUMX,SUMY,SUMA,SUMB,SUMC,TEMP,TEMPA, 2 VSMALL,XMAG,XMAGR,ZERO,ONE,TWO,ONHA,VFACT DOUBLE PRECISION A,B,G,GRAD,W,X,XL,XU C C INTRINSIC FUNCTIONS: DMAX1,DSQRT,DABS,DMIN1 C INTEGER IWZ,IWR,IWW,IWD,IWA,IFINC,KFINC,K,I,IA,ID,II,IR,IRA, 1 IRB,J,NM,IZ,IZA,ITERC,ITREF,JFINC,IFLAG,IWS,IS,K1,IW,KK,IP, 2 IPP,IL,IU,JU,KFLAG,LFLAG,JFLAG,KDROP,NU,MFLAG,KNEXT,IX,IWX, 3 IWY,IY,JL LOGICAL LQL,LOWER C C INITIAL ADDRESSES C IWZ=NMAX IWR=IWZ+NMAX*NMAX IWW=IWR+(NMAX*(NMAX+3))/2 IWD=IWW+NMAX IWX=IWD+NMAX IWA=IWX+NMAX C C SET SOME CONSTANTS. C ZERO=0.D+0 ONE=1.D+0 TWO=2.D+0 ONHA=1.5D+0 VFACT=1.D+0 C C SET SOME PARAMETERS. C NUMBER LESS THAN VSMALL ARE ASSUMED TO BE NEGLIGIBLE. C THE MULTIPLE OF I THAT IS ADDED TO G IS AT MOST DIAGR TIMES C THE LEAST MULTIPLE OF I THAT GIVES POSITIVE DEFINITENESS. C X IS RE-INITIALISED IF ITS MAGNITUDE IS REDUCED BY THE C FACTOR XMAGR. C A CHECK IS MADE FOR AN INCREASE IN F EVERY IFINC ITERATIONS, C AFTER KFINC ITERATIONS ARE COMPLETED. C DIAGR=TWO XMAGR=1.0D-2 IFINC=3 KFINC=MAX0(10,N) C C FIND THE RECIPROCALS OF THE LENGTHS OF THE CONSTRAINT NORMALS. C RETURN IF A CONSTRAINT IS INFEASIBLE DUE TO A ZERO NORMAL. C NACT=0 IF (M .LE. 0) GOTO 45 DO 40 K=1,M SUM=ZERO DO 10 I=1,N 10 SUM=SUM+A(K,I)**2 IF (SUM .GT. ZERO) GOTO 20 IF (B(K) .EQ. ZERO) GOTO 30 INFO=-K IF (K .LE. MEQ) GOTO 730 IF (B(K)) 30,30,730 20 SUM=ONE/DSQRT(SUM) 30 IA=IWA+K 40 W(IA)=SUM 45 DO 50 K=1,N IA=IWA+M+K 50 W(IA)=ONE C C IF NECESSARY INCREASE THE DIAGONAL ELEMENTS OF G. C IF (.NOT. LQL) GOTO 165 DIAG=ZERO DO 60 I=1,N ID=IWD+I W(ID)=G(I,I) DIAG=DMAX1(DIAG,VSMALL-W(ID)) IF (I .EQ. N) GOTO 60 II=I+1 DO 55 J=II,N GA=-DMIN1(W(ID),G(J,J)) GB=DABS(W(ID)-G(J,J))+DABS(G(I,J)) IF (GB .GT. ZERO) GA=GA+G(I,J)**2/GB 55 DIAG=DMAX1(DIAG,GA) 60 CONTINUE IF (DIAG .LE. ZERO) GOTO 90 70 DIAG=DIAGR*DIAG DO 80 I=1,N ID=IWD+I 80 G(I,I)=DIAG+W(ID) C C FORM THE CHOLESKY FACTORISATION OF G. THE TRANSPOSE C OF THE FACTOR WILL BE PLACED IN THE R-PARTITION OF W. C 90 IR=IWR DO 130 J=1,N IRA=IWR IRB=IR+1 DO 120 I=1,J TEMP=G(I,J) IF (I .EQ. 1) GOTO 110 DO 100 K=IRB,IR IRA=IRA+1 100 TEMP=TEMP-W(K)*W(IRA) 110 IR=IR+1 IRA=IRA+1 IF (I .LT. J) W(IR)=TEMP/W(IRA) 120 CONTINUE IF (TEMP .LT. VSMALL) GOTO 140 130 W(IR)=DSQRT(TEMP) GOTO 170 C C INCREASE FURTHER THE DIAGONAL ELEMENT OF G. C 140 W(J)=ONE SUMX=ONE K=J 150 SUM=ZERO IRA=IR-1 DO 160 I=K,J SUM=SUM-W(IRA)*W(I) 160 IRA=IRA+I IR=IR-K K=K-1 W(K)=SUM/W(IR) SUMX=SUMX+W(K)**2 IF (K .GE. 2) GOTO 150 DIAG=DIAG+VSMALL-TEMP/SUMX GOTO 70 C C STORE THE CHOLESKY FACTORISATION IN THE R-PARTITION C OF W. C 165 IR=IWR DO 166 I=1,N DO 166 J=1,I IR=IR+1 166 W(IR)=G(J,I) C C SET Z THE INVERSE OF THE MATRIX IN R. C 170 NM=N-1 DO 220 I=1,N IZ=IWZ+I IF (I .EQ. 1) GOTO 190 DO 180 J=2,I W(IZ)=ZERO 180 IZ=IZ+N 190 IR=IWR+(I+I*I)/2 W(IZ)=ONE/W(IR) IF (I .EQ. N) GOTO 220 IZA=IZ DO 210 J=I,NM IR=IR+I SUM=ZERO DO 200 K=IZA,IZ,N SUM=SUM+W(K)*W(IR) 200 IR=IR+1 IZ=IZ+N 210 W(IZ)=-SUM/W(IR) 220 CONTINUE C C SET THE INITIAL VALUES OF SOME VARIABLES. C ITERC COUNTS THE NUMBER OF ITERATIONS. C ITREF IS SET TO ONE WHEN ITERATIVE REFINEMENT IS REQUIRED. C JFINC INDICATES WHEN TO TEST FOR AN INCREASE IN F. C ITERC=1 ITREF=0 JFINC=-KFINC C C SET X TO ZERO AND SET THE CORRESPONDING RESIDUALS OF THE C KUHN-TUCKER CONDITIONS. C 230 IFLAG=1 IWS=IWW-N DO 240 I=1,N X(I)=ZERO IW=IWW+I W(IW)=GRAD(I) IF (I .GT. NACT) GOTO 240 W(I)=ZERO IS=IWS+I K=IACT(I) IF (K .LE. M) GOTO 235 IF (K .GT. MN) GOTO 234 K1=K-M W(IS)=XL(K1) GOTO 240 234 K1=K-MN W(IS)=-XU(K1) GOTO 240 235 W(IS)=B(K) 240 CONTINUE XMAG=ZERO VFACT=1.D+0 IF (NACT) 340,340,280 C C SET THE RESIDUALS OF THE KUHN-TUCKER CONDITIONS FOR GENERAL X. C 250 IFLAG=2 IWS=IWW-N DO 260 I=1,N IW=IWW+I W(IW)=GRAD(I) IF (LQL) GOTO 259 ID=IWD+I W(ID)=ZERO DO 251 J=I,N 251 W(ID)=W(ID)+G(I,J)*X(J) DO 252 J=1,I ID=IWD+J 252 W(IW)=W(IW)+G(J,I)*W(ID) GOTO 260 259 DO 261 J=1,N 261 W(IW)=W(IW)+G(I,J)*X(J) 260 CONTINUE IF (NACT .EQ. 0) GOTO 340 DO 270 K=1,NACT KK=IACT(K) IS=IWS+K IF (KK .GT. M) GOTO 265 W(IS)=B(KK) DO 264 I=1,N IW=IWW+I W(IW)=W(IW)-W(K)*A(KK,I) 264 W(IS)=W(IS)-X(I)*A(KK,I) GOTO 270 265 IF (KK .GT. MN) GOTO 266 K1=KK-M IW=IWW+K1 W(IW)=W(IW)-W(K) W(IS)=XL(K1)-X(K1) GOTO 270 266 K1=KK-MN IW=IWW+K1 W(IW)=W(IW)+W(K) W(IS)=-XU(K1)+X(K1) 270 CONTINUE C C PRE-MULTIPLY THE VECTOR IN THE S-PARTITION OF W BY THE C INVERS OF R TRANSPOSE. C 280 IR=IWR IP=IWW+1 IPP=IWW+N IL=IWS+1 IU=IWS+NACT DO 310 I=IL,IU SUM=ZERO IF (I .EQ. IL) GOTO 300 JU=I-1 DO 290 J=IL,JU IR=IR+1 290 SUM=SUM+W(IR)*W(J) 300 IR=IR+1 310 W(I)=(W(I)-SUM)/W(IR) C C SHIFT X TO SATISFY THE ACTIVE CONSTRAINTS AND MAKE THE C CORRESPONDING CHANGE TO THE GRADIENT RESIDUALS. C DO 330 I=1,N IZ=IWZ+I SUM=ZERO DO 320 J=IL,IU SUM=SUM+W(J)*W(IZ) 320 IZ=IZ+N X(I)=X(I)+SUM IF (LQL) GOTO 329 ID=IWD+I W(ID)=ZERO DO 321 J=I,N 321 W(ID)=W(ID)+G(I,J)*SUM IW=IWW+I DO 322 J=1,I ID=IWD+J 322 W(IW)=W(IW)+G(J,I)*W(ID) GOTO 330 329 DO 331 J=1,N IW=IWW+J 331 W(IW)=W(IW)+SUM*G(I,J) 330 CONTINUE C C FORM THE SCALAR PRODUCT OF THE CURRENT GRADIENT RESIDUALS C WITH EACH COLUMN OF Z. C 340 KFLAG=1 GOTO 930 350 IF (NACT .EQ. N) GOTO 380 C C SHIFT X SO THAT IT SATISFIES THE REMAINING KUHN-TUCKER C CONDITIONS. C IL=IWS+NACT+1 IZA=IWZ+NACT*N DO 370 I=1,N SUM=ZERO IZ=IZA+I DO 360 J=IL,IWW SUM=SUM+W(IZ)*W(J) 360 IZ=IZ+N 370 X(I)=X(I)-SUM INFO=0 IF (NACT .EQ. 0) GOTO 410 C C UPDATE THE LAGRANGE MULTIPLIERS. C 380 LFLAG=3 GOTO 740 390 DO 400 K=1,NACT IW=IWW+K 400 W(K)=W(K)+W(IW) C C REVISE THE VALUES OF XMAG. C BRANCH IF ITERATIVE REFINEMENT IS REQUIRED. C 410 JFLAG=1 GOTO 910 420 IF (IFLAG .EQ. ITREF) GOTO 250 C C DELETE A CONSTRAINT IF A LAGRANGE MULTIPLIER OF AN C INEQUALITY CONSTRAINT IS NEGATIVE. C KDROP=0 GOTO 440 430 KDROP=KDROP+1 IF (W(KDROP) .GE. ZERO) GOTO 440 IF (IACT(KDROP) .LE. MEQ) GOTO 440 NU=NACT MFLAG=1 GOTO 800 440 IF (KDROP .LT. NACT) GOTO 430 C C SEEK THE GREATEAST NORMALISED CONSTRAINT VIOLATION, DISREGARDING C ANY THAT MAY BE DUE TO COMPUTER ROUNDING ERRORS. C 450 CVMAX=ZERO IF (M .LE. 0) GOTO 481 DO 480 K=1,M IA=IWA+K IF (W(IA) .LE. ZERO) GOTO 480 SUM=-B(K) DO 460 I=1,N 460 SUM=SUM+X(I)*A(K,I) SUMX=-SUM*W(IA) IF (K .LE. MEQ) SUMX=DABS(SUMX) IF (SUMX .LE. CVMAX) GOTO 480 TEMP=DABS(B(K)) DO 470 I=1,N 470 TEMP=TEMP+DABS(X(I)*A(K,I)) TEMPA=TEMP+DABS(SUM) IF (TEMPA .LE. TEMP) GOTO 480 TEMP=TEMP+ONHA*DABS(SUM) IF (TEMP .LE. TEMPA) GOTO 480 CVMAX=SUMX RES=SUM KNEXT=K 480 CONTINUE 481 DO 485 K=1,N LOWER=.TRUE. IA=IWA+M+K IF (W(IA) .LE. ZERO) GOTO 485 SUM=XL(K)-X(K) IF (SUM) 482,485,483 482 SUM=X(K)-XU(K) LOWER=.FALSE. 483 IF (SUM .LE. CVMAX) GOTO 485 CVMAX=SUM RES=-SUM KNEXT=K+M IF (LOWER) GOTO 485 KNEXT=K+MN 485 CONTINUE C C TEST FOR CONVERGENCE C INFO=0 IF (CVMAX .LE. VSMALL) GOTO 700 C C RETURN IF, DUE TO ROUNDING ERRORS, THE ACTUAL CHANGE IN C X MAY NOT INCREASE THE OBJECTIVE FUNCTION C JFINC=JFINC+1 IF (JFINC .EQ. 0) GOTO 510 IF (JFINC .NE. IFINC) GOTO 530 FDIFF=ZERO FDIFFA=ZERO DO 500 I=1,N SUM=TWO*GRAD(I) SUMX=DABS(SUM) IF (LQL) GOTO 489 ID=IWD+I W(ID)=ZERO DO 486 J=I,N IX=IWX+J 486 W(ID)=W(ID)+G(I,J)*(W(IX)+X(J)) DO 487 J=1,I ID=IWD+J TEMP=G(J,I)*W(ID) SUM=SUM+TEMP 487 SUMX=SUMX+DABS(TEMP) GOTO 495 489 DO 490 J=1,N IX=IWX+J TEMP=G(I,J)*(W(IX)+X(J)) SUM=SUM+TEMP 490 SUMX=SUMX+DABS(TEMP) 495 IX=IWX+I FDIFF=FDIFF+SUM*(X(I)-W(IX)) 500 FDIFFA=FDIFFA+SUMX*DABS(X(I)-W(IX)) INFO=2 SUM=FDIFFA+FDIFF IF (SUM .LE. FDIFFA) GOTO 700 TEMP=FDIFFA+ONHA*FDIFF IF (TEMP .LE. SUM) GOTO 700 JFINC=0 INFO=0 510 DO 520 I=1,N IX=IWX+I 520 W(IX)=X(I) C C FORM THE SCALAR PRODUCT OF THE NEW CONSTRAINT NORMAL WITH EACH C COLUMN OF Z. PARNEW WILL BECOME THE LAGRANGE MULTIPLIER OF C THE NEW CONSTRAINT. C 530 ITERC=ITERC+1 IF (ITERC.LE.MAXIT) GOTO 531 INFO=1 GOTO 710 531 CONTINUE IWS=IWR+(NACT+NACT*NACT)/2 IF (KNEXT .GT. M) GOTO 541 DO 540 I=1,N IW=IWW+I 540 W(IW)=A(KNEXT,I) GOTO 549 541 DO 542 I=1,N IW=IWW+I 542 W(IW)=ZERO K1=KNEXT-M IF (K1 .GT. N) GOTO 545 IW=IWW+K1 W(IW)=ONE IZ=IWZ+K1 DO 543 I=1,N IS=IWS+I W(IS)=W(IZ) 543 IZ=IZ+N GOTO 550 545 K1=KNEXT-MN IW=IWW+K1 W(IW)=-ONE IZ=IWZ+K1 DO 546 I=1,N IS=IWS+I W(IS)=-W(IZ) 546 IZ=IZ+N GOTO 550 549 KFLAG=2 GOTO 930 550 PARNEW=ZERO C C APPLY GIVENS ROTATIONS TO MAKE THE LAST (N-NACT-2) SCALAR C PRODUCTS EQUAL TO ZERO. C IF (NACT .EQ. N) GOTO 570 NU=N NFLAG=1 GOTO 860 C C BRANCH IF THERE IS NO NEED TO DELETE A CONSTRAINT. C 560 IS=IWS+NACT IF (NACT .EQ. 0) GOTO 640 SUMA=ZERO SUMB=ZERO SUMC=ZERO IZ=IWZ+NACT*N DO 563 I=1,N IZ=IZ+1 IW=IWW+I SUMA=SUMA+W(IW)*W(IZ) SUMB=SUMB+DABS(W(IW)*W(IZ)) 563 SUMC=SUMC+W(IZ)**2 TEMP=SUMB+.1D+0*DABS(SUMA) TEMPA=SUMB+.2D+0*DABS(SUMA) IF (TEMP .LE. SUMB) GOTO 570 IF (TEMPA .LE. TEMP) GOTO 570 IF (SUMB .GT. VSMALL) GOTO 5 GOTO 570 5 SUMC=DSQRT(SUMC) IA=IWA+KNEXT IF (KNEXT .LE. M) SUMC=SUMC/W(IA) TEMP=SUMC+.1D+0*DABS(SUMA) TEMPA=SUMC+.2D+0*DABS(SUMA) IF (TEMP .LE. SUMC) GOTO 567 IF (TEMPA .LE. TEMP) GOTO 567 GOTO 640 C C CALCULATE THE MULTIPLIERS FOR THE NEW CONSTRAINT NORMAL C EXPRESSED IN TERMS OF THE ACTIVE CONSTRAINT NORMALS. C THEN WORK OUT WHICH CONTRAINT TO DROP. C 567 LFLAG=4 GOTO 740 570 LFLAG=1 GOTO 740 C C COMPLETE THE TEST FOR LINEARLY DEPENDENT CONSTRAINTS. C 571 IF (KNEXT .GT. M) GOTO 574 DO 573 I=1,N SUMA=A(KNEXT,I) SUMB=DABS(SUMA) IF (NACT.EQ.0) GOTO 581 DO 572 K=1,NACT KK=IACT(K) IF (KK.LE.M) GOTO 568 KK=KK-M TEMP=ZERO IF (KK.EQ.I) TEMP=W(IWW+KK) KK=KK-N IF (KK.EQ.I) TEMP=-W(IWW+KK) GOTO 569 568 CONTINUE IW=IWW+K TEMP=W(IW)*A(KK,I) 569 CONTINUE SUMA=SUMA-TEMP 572 SUMB=SUMB+DABS(TEMP) 581 IF (SUMA .LE. VSMALL) GOTO 573 TEMP=SUMB+.1D+0*DABS(SUMA) TEMPA=SUMB+.2D+0*DABS(SUMA) IF (TEMP .LE. SUMB) GOTO 573 IF (TEMPA .LE. TEMP) GOTO 573 GOTO 630 573 CONTINUE LFLAG=1 GOTO 775 574 K1=KNEXT-M IF (K1 .GT. N) K1=K1-N DO 578 I=1,N SUMA=ZERO IF (I .NE. K1) GOTO 575 SUMA=ONE IF (KNEXT .GT. MN) SUMA=-ONE 575 SUMB=DABS(SUMA) IF (NACT.EQ.0) GOTO 582 DO 577 K=1,NACT KK=IACT(K) IF (KK .LE. M) GOTO 579 KK=KK-M TEMP=ZERO IF (KK.EQ.I) TEMP=W(IWW+KK) KK=KK-N IF (KK.EQ.I) TEMP=-W(IWW+KK) GOTO 576 579 IW=IWW+K TEMP=W(IW)*A(KK,I) 576 SUMA=SUMA-TEMP 577 SUMB=SUMB+DABS(TEMP) 582 TEMP=SUMB+.1D+0*DABS(SUMA) TEMPA=SUMB+.2D+0*DABS(SUMA) IF (TEMP .LE. SUMB) GOTO 578 IF (TEMPA .LE. TEMP) GOTO 578 GOTO 630 578 CONTINUE LFLAG=1 GOTO 775 C C BRANCH IF THE CONTRAINTS ARE INCONSISTENT. C 580 INFO=-KNEXT IF (KDROP .EQ. 0) GOTO 700 PARINC=RATIO PARNEW=PARINC C C REVISE THE LAGRANGE MULTIPLIERS OF THE ACTIVE CONSTRAINTS. C 590 IF (NACT.EQ.0) GOTO 601 DO 600 K=1,NACT IW=IWW+K W(K)=W(K)-PARINC*W(IW) IF (IACT(K) .GT. MEQ) W(K)=DMAX1(ZERO,W(K)) 600 CONTINUE 601 IF (KDROP .EQ. 0) GOTO 680 C C DELETE THE CONSTRAINT TO BE DROPPED. C SHIFT THE VECTOR OF SCALAR PRODUCTS. C THEN, IF APPROPRIATE, MAKE ONE MORE SCALAR PRODUCT ZERO. C NU=NACT+1 MFLAG=2 GOTO 800 610 IWS=IWS-NACT-1 NU=MIN0(N,NU) DO 620 I=1,NU IS=IWS+I J=IS+NACT 620 W(IS)=W(J+1) NFLAG=2 GOTO 860 C C CALCULATE THE STEP TO THE VIOLATED CONSTRAINT. C 630 IS=IWS+NACT 640 SUMY=W(IS+1) STEP=-RES/SUMY PARINC=STEP/SUMY IF (NACT .EQ. 0) GOTO 660 C C CALCULATE THE CHANGES TO THE LAGRANGE MULTIPLIERS, AND REDUCE C THE STEP ALONG THE NEW SEARCH DIRECTION IF NECESSARY. C LFLAG=2 GOTO 740 650 IF (KDROP .EQ. 0) GOTO 660 TEMP=ONE-RATIO/PARINC IF (TEMP .LE. ZERO) KDROP=0 IF (KDROP .EQ. 0) GOTO 660 STEP=RATIO*SUMY PARINC=RATIO RES=TEMP*RES C C UPDATE X AND THE LAGRANGE MULTIPIERS. C DROP A CONSTRAINT IF THE FULL STEP IS NOT TAKEN. C 660 IWY=IWZ+NACT*N DO 670 I=1,N IY=IWY+I 670 X(I)=X(I)+STEP*W(IY) PARNEW=PARNEW+PARINC IF (NACT .GE. 1) GOTO 590 C C ADD THE NEW CONSTRAINT TO THE ACTIVE SET. C 680 NACT=NACT+1 W(NACT)=PARNEW IACT(NACT)=KNEXT IA=IWA+KNEXT IF (KNEXT .GT. MN) IA=IA-N W(IA)=-W(IA) C C ESTIMATE THE MAGNITUDE OF X. THEN BEGIN A NEW ITERATION, C RE-INITILISING X IF THIS MAGNITUDE IS SMALL. C JFLAG=2 GOTO 910 690 IF (SUM .LT. (XMAGR*XMAG)) GOTO 230 IF (ITREF) 450,450,250 C C INITIATE ITERATIVE REFINEMENT IF IT HAS NOT YET BEEN USED, C OR RETURN AFTER RESTORING THE DIAGONAL ELEMENTS OF G. C 700 IF (ITERC .EQ. 0) GOTO 710 ITREF=ITREF+1 JFINC=-1 IF (ITREF .EQ. 1) GOTO 250 710 IF (.NOT. LQL) RETURN DO 720 I=1,N ID=IWD+I 720 G(I,I)=W(ID) 730 RETURN C C C THE REMAINIG INSTRUCTIONS ARE USED AS SUBROUTINES. C C C******************************************************************** C C C CALCULATE THE LAGRANGE MULTIPLIERS BY PRE-MULTIPLYING THE C VECTOR IN THE S-PARTITION OF W BY THE INVERSE OF R. C 740 IR=IWR+(NACT+NACT*NACT)/2 I=NACT SUM=ZERO GOTO 770 750 IRA=IR-1 SUM=ZERO IF (NACT.EQ.0) GOTO 761 DO 760 J=I,NACT IW=IWW+J SUM=SUM+W(IRA)*W(IW) 760 IRA=IRA+J 761 IR=IR-I I=I-1 770 IW=IWW+I IS=IWS+I W(IW)=(W(IS)-SUM)/W(IR) IF (I .GT. 1) GOTO 750 IF (LFLAG .EQ. 3) GOTO 390 IF (LFLAG .EQ. 4) GOTO 571 C C CALCULATE THE NEXT CONSTRAINT TO DROP. C 775 IP=IWW+1 IPP=IWW+NACT KDROP=0 IF (NACT.EQ.0) GOTO 791 DO 790 K=1,NACT IF (IACT(K) .LE. MEQ) GOTO 790 IW=IWW+K IF ((RES*W(IW)) .GE. ZERO) GOTO 790 TEMP=W(K)/W(IW) IF (KDROP .EQ. 0) GOTO 780 IF (DABS(TEMP) .GE. DABS(RATIO)) GOTO 790 780 KDROP=K RATIO=TEMP 790 CONTINUE 791 GOTO (580,650), LFLAG C C C******************************************************************** C C C DROP THE CONSTRAINT IN POSITION KDROP IN THE ACTIVE SET. C 800 IA=IWA+IACT(KDROP) IF (IACT(KDROP) .GT. MN) IA=IA-N W(IA)=-W(IA) IF (KDROP .EQ. NACT) GOTO 850 C C SET SOME INDICES AND CALCULATE THE ELEMENTS OF THE NEXT C GIVENS ROTATION. C IZ=IWZ+KDROP*N IR=IWR+(KDROP+KDROP*KDROP)/2 810 IRA=IR IR=IR+KDROP+1 TEMP=DMAX1(DABS(W(IR-1)),DABS(W(IR))) SUM=TEMP*DSQRT((W(IR-1)/TEMP)**2+(W(IR)/TEMP)**2) GA=W(IR-1)/SUM GB=W(IR)/SUM C C EXCHANGE THE COLUMNS OF R. C DO 820 I=1,KDROP IRA=IRA+1 J=IRA-KDROP TEMP=W(IRA) W(IRA)=W(J) 820 W(J)=TEMP W(IR)=ZERO C C APPLY THE ROTATION TO THE ROWS OF R. C W(J)=SUM KDROP=KDROP+1 DO 830 I=KDROP,NU TEMP=GA*W(IRA)+GB*W(IRA+1) W(IRA+1)=GA*W(IRA+1)-GB*W(IRA) W(IRA)=TEMP 830 IRA=IRA+I C C APPLY THE ROTATION TO THE COLUMNS OF Z. C DO 840 I=1,N IZ=IZ+1 J=IZ-N TEMP=GA*W(J)+GB*W(IZ) W(IZ)=GA*W(IZ)-GB*W(J) 840 W(J)=TEMP C C REVISE IACT AND THE LAGRANGE MULTIPLIERS. C IACT(KDROP-1)=IACT(KDROP) W(KDROP-1)=W(KDROP) IF (KDROP .LT. NACT) GOTO 810 850 NACT=NACT-1 GOTO (250,610), MFLAG C C C******************************************************************** C C C APPLY GIVENS ROTATION TO REDUCE SOME OF THE SCALAR C PRODUCTS IN THE S-PARTITION OF W TO ZERO. C 860 IZ=IWZ+NU*N 870 IZ=IZ-N 880 IS=IWS+NU NU=NU-1 IF (NU .EQ. NACT) GOTO 900 IF (W(IS) .EQ. ZERO) GOTO 870 TEMP=DMAX1(DABS(W(IS-1)),DABS(W(IS))) SUM=TEMP*DSQRT((W(IS-1)/TEMP)**2+(W(IS)/TEMP)**2) GA=W(IS-1)/SUM GB=W(IS)/SUM W(IS-1)=SUM DO 890 I=1,N K=IZ+N TEMP=GA*W(IZ)+GB*W(K) W(K)=GA*W(K)-GB*W(IZ) W(IZ)=TEMP 890 IZ=IZ-1 GOTO 880 900 GOTO (560,630), NFLAG C C C******************************************************************** C C C CALCULATE THE MAGNITUDE OF X AN REVISE XMAG. C 910 SUM=ZERO DO 920 I=1,N SUM=SUM+DABS(X(I))*VFACT*(DABS(GRAD(I))+DABS(G(I,I)*X(I))) IF (LQL) GOTO 920 IF (SUM .LT. 1.D-30) GOTO 920 VFACT=1.D-10*VFACT SUM=1.D-10*SUM XMAG=1.D-10*XMAG 920 CONTINUE 925 XMAG=DMAX1(XMAG,SUM) GOTO (420,690), JFLAG C C C******************************************************************** C C C PRE-MULTIPLY THE VECTOR IN THE W-PARTITION OF W BY Z TRANSPOSE. C 930 JL=IWW+1 IZ=IWZ DO 940 I=1,N IS=IWS+I W(IS)=ZERO IWWN=IWW+N DO 940 J=JL,IWWN IZ=IZ+1 940 W(IS)=W(IS)+W(IZ)*W(J) GOTO (350,550), KFLAG RETURN END