123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- *DECK LPDP
- SUBROUTINE LPDP (A, MDA, M, N1, N2, PRGOPT, X, WNORM, MODE, WS,
- + IS)
- C***BEGIN PROLOGUE LPDP
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to LSEI
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (LPDP-S, DLPDP-D)
- C***AUTHOR Hanson, R. J., (SNLA)
- C Haskell, K. H., (SNLA)
- C***DESCRIPTION
- C
- C DIMENSION A(MDA,N+1),PRGOPT(*),X(N),WS((M+2)*(N+7)),IS(M+N+1),
- C where N=N1+N2. This is a slight overestimate for WS(*).
- C
- C Determine an N1-vector W, and
- C an N2-vector Z
- C which minimizes the Euclidean length of W
- C subject to G*W+H*Z .GE. Y.
- C This is the least projected distance problem, LPDP.
- C The matrices G and H are of respective
- C dimensions M by N1 and M by N2.
- C
- C Called by subprogram LSI( ).
- C
- C The matrix
- C (G H Y)
- C
- C occupies rows 1,...,M and cols 1,...,N1+N2+1 of A(*,*).
- C
- C The solution (W) is returned in X(*).
- C (Z)
- C
- C The value of MODE indicates the status of
- C the computation after returning to the user.
- C
- C MODE=1 The solution was successfully obtained.
- C
- C MODE=2 The inequalities are inconsistent.
- C
- C***SEE ALSO LSEI
- C***ROUTINES CALLED SCOPY, SDOT, SNRM2, SSCAL, WNNLS
- C***REVISION HISTORY (YYMMDD)
- C 790701 DATE WRITTEN
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900328 Added TYPE section. (WRB)
- C 910408 Updated the AUTHOR section. (WRB)
- C***END PROLOGUE LPDP
- C
- C SUBROUTINES CALLED
- C
- C WNNLS SOLVES A NONNEGATIVELY CONSTRAINED LINEAR LEAST
- C SQUARES PROBLEM WITH LINEAR EQUALITY CONSTRAINTS.
- C PART OF THIS PACKAGE.
- C
- C++
- C SDOT, SUBROUTINES FROM THE BLAS PACKAGE.
- C SSCAL,SNRM2, SEE TRANS. MATH. SOFT., VOL. 5, NO. 3, P. 308.
- C SCOPY
- C
- REAL A(MDA,*), PRGOPT(*), WS(*), WNORM, X(*)
- INTEGER IS(*)
- REAL FAC, ONE, RNORM, SC, YNORM, ZERO
- REAL SDOT, SNRM2
- SAVE ZERO, ONE, FAC
- DATA ZERO, ONE /0.E0,1.E0/, FAC /0.1E0/
- C***FIRST EXECUTABLE STATEMENT LPDP
- N = N1 + N2
- MODE = 1
- IF (.NOT.(M.LE.0)) GO TO 20
- IF (.NOT.(N.GT.0)) GO TO 10
- X(1) = ZERO
- CALL SCOPY(N, X, 0, X, 1)
- 10 WNORM = ZERO
- RETURN
- 20 NP1 = N + 1
- C
- C SCALE NONZERO ROWS OF INEQUALITY MATRIX TO HAVE LENGTH ONE.
- DO 40 I=1,M
- SC = SNRM2(N,A(I,1),MDA)
- IF (.NOT.(SC.NE.ZERO)) GO TO 30
- SC = ONE/SC
- CALL SSCAL(NP1, SC, A(I,1), MDA)
- 30 CONTINUE
- 40 CONTINUE
- C
- C SCALE RT.-SIDE VECTOR TO HAVE LENGTH ONE (OR ZERO).
- YNORM = SNRM2(M,A(1,NP1),1)
- IF (.NOT.(YNORM.NE.ZERO)) GO TO 50
- SC = ONE/YNORM
- CALL SSCAL(M, SC, A(1,NP1), 1)
- C
- C SCALE COLS OF MATRIX H.
- 50 J = N1 + 1
- 60 IF (.NOT.(J.LE.N)) GO TO 70
- SC = SNRM2(M,A(1,J),1)
- IF (SC.NE.ZERO) SC = ONE/SC
- CALL SSCAL(M, SC, A(1,J), 1)
- X(J) = SC
- J = J + 1
- GO TO 60
- 70 IF (.NOT.(N1.GT.0)) GO TO 130
- C
- C COPY TRANSPOSE OF (H G Y) TO WORK ARRAY WS(*).
- IW = 0
- DO 80 I=1,M
- C
- C MOVE COL OF TRANSPOSE OF H INTO WORK ARRAY.
- CALL SCOPY(N2, A(I,N1+1), MDA, WS(IW+1), 1)
- IW = IW + N2
- C
- C MOVE COL OF TRANSPOSE OF G INTO WORK ARRAY.
- CALL SCOPY(N1, A(I,1), MDA, WS(IW+1), 1)
- IW = IW + N1
- C
- C MOVE COMPONENT OF VECTOR Y INTO WORK ARRAY.
- WS(IW+1) = A(I,NP1)
- IW = IW + 1
- 80 CONTINUE
- WS(IW+1) = ZERO
- CALL SCOPY(N, WS(IW+1), 0, WS(IW+1), 1)
- IW = IW + N
- WS(IW+1) = ONE
- IW = IW + 1
- C
- C SOLVE EU=F SUBJECT TO (TRANSPOSE OF H)U=0, U.GE.0. THE
- C MATRIX E = TRANSPOSE OF (G Y), AND THE (N+1)-VECTOR
- C F = TRANSPOSE OF (0,...,0,1).
- IX = IW + 1
- IW = IW + M
- C
- C DO NOT CHECK LENGTHS OF WORK ARRAYS IN THIS USAGE OF WNNLS( ).
- IS(1) = 0
- IS(2) = 0
- CALL WNNLS(WS, NP1, N2, NP1-N2, M, 0, PRGOPT, WS(IX), RNORM,
- 1 MODEW, IS, WS(IW+1))
- C
- C COMPUTE THE COMPONENTS OF THE SOLN DENOTED ABOVE BY W.
- SC = ONE - SDOT(M,A(1,NP1),1,WS(IX),1)
- IF (.NOT.(ONE+FAC*ABS(SC).NE.ONE .AND. RNORM.GT.ZERO)) GO TO 110
- SC = ONE/SC
- DO 90 J=1,N1
- X(J) = SC*SDOT(M,A(1,J),1,WS(IX),1)
- 90 CONTINUE
- C
- C COMPUTE THE VECTOR Q=Y-GW. OVERWRITE Y WITH THIS VECTOR.
- DO 100 I=1,M
- A(I,NP1) = A(I,NP1) - SDOT(N1,A(I,1),MDA,X,1)
- 100 CONTINUE
- GO TO 120
- 110 MODE = 2
- RETURN
- 120 CONTINUE
- 130 IF (.NOT.(N2.GT.0)) GO TO 180
- C
- C COPY TRANSPOSE OF (H Q) TO WORK ARRAY WS(*).
- IW = 0
- DO 140 I=1,M
- CALL SCOPY(N2, A(I,N1+1), MDA, WS(IW+1), 1)
- IW = IW + N2
- WS(IW+1) = A(I,NP1)
- IW = IW + 1
- 140 CONTINUE
- WS(IW+1) = ZERO
- CALL SCOPY(N2, WS(IW+1), 0, WS(IW+1), 1)
- IW = IW + N2
- WS(IW+1) = ONE
- IW = IW + 1
- IX = IW + 1
- IW = IW + M
- C
- C SOLVE RV=S SUBJECT TO V.GE.0. THE MATRIX R =(TRANSPOSE
- C OF (H Q)), WHERE Q=Y-GW. THE (N2+1)-VECTOR S =(TRANSPOSE
- C OF (0,...,0,1)).
- C
- C DO NOT CHECK LENGTHS OF WORK ARRAYS IN THIS USAGE OF WNNLS( ).
- IS(1) = 0
- IS(2) = 0
- CALL WNNLS(WS, N2+1, 0, N2+1, M, 0, PRGOPT, WS(IX), RNORM, MODEW,
- 1 IS, WS(IW+1))
- C
- C COMPUTE THE COMPONENTS OF THE SOLN DENOTED ABOVE BY Z.
- SC = ONE - SDOT(M,A(1,NP1),1,WS(IX),1)
- IF (.NOT.(ONE+FAC*ABS(SC).NE.ONE .AND. RNORM.GT.ZERO)) GO TO 160
- SC = ONE/SC
- DO 150 J=1,N2
- L = N1 + J
- X(L) = SC*SDOT(M,A(1,L),1,WS(IX),1)*X(L)
- 150 CONTINUE
- GO TO 170
- 160 MODE = 2
- RETURN
- 170 CONTINUE
- C
- C ACCOUNT FOR SCALING OF RT.-SIDE VECTOR IN SOLUTION.
- 180 CALL SSCAL(N, YNORM, X, 1)
- WNORM = SNRM2(N1,X,1)
- RETURN
- END
|