Mercurial > octave
view libcruft/qpsol/qpcolr.f @ 2329:30c606bec7a8
[project @ 1996-07-19 01:29:05 by jwe]
Initial revision
author | jwe |
---|---|
date | Fri, 19 Jul 1996 01:29:55 +0000 |
parents | |
children |
line wrap: on
line source
SUBROUTINE QPCOLR( NOCURV, POSDEF, RENEWR, UNITQ, QPHESS, * N, NCOLR, NCTOTL, NFREE, NQ, NROWH, NCOLH, * NROWRT, NCOLRT, NHESS, KFREE, * CSLAST, SNLAST, DRMAX, EMAX, HSIZE, RDLAST, * HESS, RT, SCALE, ZY, HZ, WRK ) C C IMPLICIT REAL*8(A-H,O-Z) INTEGER N, NCOLR, NCTOTL, NFREE, NQ, NROWH, NCOLH, * NROWRT, NCOLRT, NHESS INTEGER KFREE(N) DOUBLE PRECISION CSLAST, SNLAST, DRMAX, EMAX, HSIZE, RDLAST DOUBLE PRECISION HESS(NROWH,NCOLH), RT(NROWRT,NCOLRT), HZ(N), * SCALE(NCTOTL), ZY(NQ,NQ) DOUBLE PRECISION WRK(N) LOGICAL NOCURV, POSDEF, RENEWR, UNITQ EXTERNAL QPHESS C INTEGER NOUT, MSG, ISTART DOUBLE PRECISION WMACH COMMON /SOLMCH/ WMACH(15) COMMON /SOL1CM/ NOUT, MSG, ISTART C LOGICAL SCLDQP COMMON /SOL2LP/ SCLDQP C C ********************************************************************* C QPCOLR IS USED TO COMPUTE ELEMENTS OF THE (NCOLR)-TH COLUMN OF R, C THE CHOLESKY FACTOR OF THE PROJECTED HESSIAN. IF RENEWR IS TRUE C ON ENTRY, THE COMPLETE COLUMN IS TO BE COMPUTED. OTHERWISE, ONLY C THE LAST DIAGONAL ELEMENT IS REQUIRED. C IF THE RESULTING PROJECTED HESSIAN IS SINGULAR OR INDEFINITE, ITS C LAST DIAGONAL ELEMENT IS INCREASED BY AN AMOUNT EMAX THAT ENSURES C POSITIVE DEFINITENESS. THIS DIAGONAL MODIFICATION WILL ALTER THE C SCALE OF THE QP SEARCH VECTOR P, BUT NOT ITS DIRECTION. C C ON EXIT, QPCOLR WILL HAVE STORED THE NCOLR ELEMENTS OF THE NEW C COLUMN OF R IN THE ARRAY RT, AND SET THE VARIABLES NOCURV, C POSDEF, RENEWR, DRMAX, EMAX AND HSIZE. C C SYSTEMS OPTIMIZATION LABORATORY, STANFORD UNIVERSITY. C ORIGINAL VERSION MARCH 1982. REV. APRIL 1982. C ********************************************************************* C INTEGER J, JTHCOL, K, NCOLR1 DOUBLE PRECISION EPSMCH, RDSMAX, RDSMIN, RDSQ, RNORM, S, ZTHZ DOUBLE PRECISION ZERO, ONE, TWO, TEN DOUBLE PRECISION DSQRT, V2NORM DOUBLE PRECISION DABS, DMAX1 DATA ZERO , ONE , TWO , TEN * /0.0D+0, 1.0D+0, 2.0D+0, 10.0D+0/ C EPSMCH = WMACH(3) C IF (RENEWR) GO TO 300 C C --------------------------------------------------------------------- C ONLY THE LAST ELEMENT OF THE NEW COLUMN OF R NEED BE COMPUTED. C THIS SITUATION CAN ONLY OCCUR WHEN A CONSTRAINT IS ADDED TO THE C WORKING SET WITH ZTHZ NOT POSITIVE DEFINITE. C --------------------------------------------------------------------- C THE LAST DIAGONAL ELEMENT OF R IS THAT OF ZTHZ PLUS A DIAGONAL C MODIFICATION. THE SQUARE OF THE TRUE DIAGONAL IS RECOVERED FROM THE C ROTATIONS USED TO UPDATE R WHEN THE CONSTRAINT WAS ADDED TO THE C WORKING SET. C RDLAST = RT(NCOLR,NCOLR) S = DABS( SNLAST ) RDSQ = ( (CSLAST - S)*RDLAST )*( (CSLAST + S)*RDLAST ) GO TO 600 C C --------------------------------------------------------------------- C THE PROJECTED HESSIAN IS EXPANDED BY A ROW AND COLUMN. COMPUTE THE C FIRST (NCOLR - 1) ELEMENTS OF THE NEW COLUMN OF THE CHOLESKY FACTOR C R. ALSO, COMPUTE RDSQ, THE SQUARE OF THE LAST DIAGONAL ELEMENT. C --------------------------------------------------------------------- 300 CALL ZEROVC( N, WRK, N, 1 ) IF (UNITQ) GO TO 320 C C EXPAND THE NEW COLUMN OF Z IN TO AN N-VECTOR. C DO 310 K = 1, NFREE J = KFREE(K) WRK(J) = ZY(K,NCOLR) 310 CONTINUE IF (SCLDQP) CALL DSCALE( N, SCALE, N, 1, WRK, N, 1 ) JTHCOL = 0 GO TO 330 C C ONLY BOUNDS ARE IN THE WORKING SET (NFREE IS EQUAL TO NCOLZ). THE C (NCOLR)-TH COLUMN OF Z IS JUST A COLUMN OF THE IDENTITY MATRIX. C 320 JTHCOL = KFREE(NCOLR) WRK(JTHCOL) = ONE C C COMPUTE THE HESSIAN TIMES THE LAST COLUMN OF Z. C 330 CALL QPHESS( N, NROWH, NCOLH, JTHCOL, HESS, WRK, HZ ) NHESS = NHESS + 1 C IF (UNITQ .AND. SCLDQP) CALL SSCALE( N, SCALE(JTHCOL), HZ, N,1 ) IF ( SCLDQP) CALL DSCALE( N, SCALE, N, 1, HZ, N,1 ) C C COMPUTE THE (NCOLR)-TH COLUMN OF Z(T)H Z. C CALL ZYPROD( 4, N, NFREE, NCOLR, NFREE, NQ, UNITQ, * KFREE, KFREE, HZ, ZY, WRK ) C CALL COPYVC( NCOLR, HZ, NCOLR, 1, RT(1,NCOLR), NCOLR, 1 ) C C COMPUTE THE FIRST (NCOLR - 1) ELEMENTS OF THE LAST COLUMN OF R. C NCOLR1 = NCOLR - 1 ZTHZ = RT(NCOLR,NCOLR) RDSQ = ZTHZ IF (NCOLR1 .EQ. 0) GO TO 370 CALL RSOLVE( 2, NROWRT, NCOLR1, RT, RT(1,NCOLR) ) RNORM = V2NORM( NCOLR1, RT(1,NCOLR), NCOLR1, 1 ) C C COMPUTE THE SQUARE OF THE LAST DIAGONAL ELEMENT OF R. C RDSQ = ZTHZ - RNORM*RNORM C C UPDATE THE ESTIMATE OF THE NORM OF THE HESSIAN. C 370 HSIZE = DMAX1( HSIZE, DABS( ZTHZ ) ) C C --------------------------------------------------------------------- C COMPUTE RDLAST, THE LAST DIAGONAL OF R. THE VARIABLES POSDEF AND C NOCURV ARE SET HERE. THEY ARE USED TO INDICATE IF THE NEW PROJECTED C HESSIAN IS POSITIVE DEFINITE OR SINGULAR. IF POSDEF IS SET TO C FALSE, RDLAST WILL BE THAT OF ZTHZ PLUS A DIAGONAL MODIFICATION. C IF THE REQUIRED DIAGONAL MODIFICATION IS LARGE, RENEWR WILL BE SET C TO BE TRUE, INDICATING THAT THE LAST ROW AND COLUMN OF R MUST BE C RECOMPUTED WHEN A CONSTRAINT IS ADDED TO THE WORKING SET DURING THE C NEXT ITERATION. C --------------------------------------------------------------------- 600 NOCURV = .FALSE. RENEWR = .FALSE. EMAX = ZERO C C RDSMIN IS THE SQUARE OF THE SMALLEST ALLOWABLE DIAGONAL ELEMENT C FOR A POSITIVE-DEFINITE CHOLESKY FACTOR. NOTE THAT THE TEST FOR A C SINGULAR MATRIX IS SCALE DEPENDENT. C IF (NCOLR .EQ. 1) RDSMIN = EPSMCH*HSIZE IF (NCOLR .GT. 1) RDSMIN = (EPSMCH*DRMAX) * DRMAX POSDEF = RDSQ .GT. RDSMIN IF (POSDEF) GO TO 900 C IF (RDSQ .LT. ( - RDSMIN )) GO TO 610 C C --------------------------------------------------------------------- C THE PROJECTED HESSIAN IS SINGULAR. C --------------------------------------------------------------------- C THE QUADRATIC HAS NO CURVATURE ALONG AT LEAST ONE DIRECTION. THE C PERTURBATION EMAX IS CHOSEN TO MAKE THE NEW EIGENVALUE OF ZTHZ C SMALL AND POSITIVE. C EMAX = RDSMIN - RDSQ RDSQ = RDSMIN NOCURV = .TRUE. GO TO 900 C C --------------------------------------------------------------------- C THE PROJECTED HESSIAN IS INDEFINITE. THERE ARE TWO CASES. C --------------------------------------------------------------------- C CASE 1. THE MODULUS OF THE NEW LAST DIAGONAL OF R IS NOT TOO C LARGE. THE MODULUS OF RDSQ IS USED FOR THE SQUARE ROOT. C 610 RDSMAX = TEN * HSIZE IF (RDSQ .LT. ( - RDSMAX )) GO TO 620 EMAX = - TWO*RDSQ GO TO 900 C C CASE 2. THE MODULUS OF THE LAST DIAGONAL OF R IS JUDGED TO BE TOO C LARGE (SOME LOSS OF PRECISION MAY HAVE OCCURRED). SET RENEWR SO C THAT THE LAST COLUMN IS RECOMPUTED LATER. C 620 EMAX = RDSMAX - RDSQ RENEWR = .TRUE. RDSQ = RDSMAX C C COMPUTE THE LAST DIAGONAL ELEMENT. C 900 RDLAST = DSQRT( DABS( RDSQ ) ) RT(NCOLR,NCOLR) = RDLAST C IF (MSG .GE. 80 .AND. (.NOT. POSDEF)) *WRITE (NOUT, 9000) POSDEF, NOCURV, EMAX, RDLAST C RETURN C 9000 FORMAT(/ 54H //QPCOLR// POSDEF NOCURV EMAX RDLAST * / 13H //QPCOLR// , L6, 1X, L6, 2(1PE14.4) ) C C END OF QPCOLR END