lpdp.f 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. *DECK LPDP
  2. SUBROUTINE LPDP (A, MDA, M, N1, N2, PRGOPT, X, WNORM, MODE, WS,
  3. + IS)
  4. C***BEGIN PROLOGUE LPDP
  5. C***SUBSIDIARY
  6. C***PURPOSE Subsidiary to LSEI
  7. C***LIBRARY SLATEC
  8. C***TYPE SINGLE PRECISION (LPDP-S, DLPDP-D)
  9. C***AUTHOR Hanson, R. J., (SNLA)
  10. C Haskell, K. H., (SNLA)
  11. C***DESCRIPTION
  12. C
  13. C DIMENSION A(MDA,N+1),PRGOPT(*),X(N),WS((M+2)*(N+7)),IS(M+N+1),
  14. C where N=N1+N2. This is a slight overestimate for WS(*).
  15. C
  16. C Determine an N1-vector W, and
  17. C an N2-vector Z
  18. C which minimizes the Euclidean length of W
  19. C subject to G*W+H*Z .GE. Y.
  20. C This is the least projected distance problem, LPDP.
  21. C The matrices G and H are of respective
  22. C dimensions M by N1 and M by N2.
  23. C
  24. C Called by subprogram LSI( ).
  25. C
  26. C The matrix
  27. C (G H Y)
  28. C
  29. C occupies rows 1,...,M and cols 1,...,N1+N2+1 of A(*,*).
  30. C
  31. C The solution (W) is returned in X(*).
  32. C (Z)
  33. C
  34. C The value of MODE indicates the status of
  35. C the computation after returning to the user.
  36. C
  37. C MODE=1 The solution was successfully obtained.
  38. C
  39. C MODE=2 The inequalities are inconsistent.
  40. C
  41. C***SEE ALSO LSEI
  42. C***ROUTINES CALLED SCOPY, SDOT, SNRM2, SSCAL, WNNLS
  43. C***REVISION HISTORY (YYMMDD)
  44. C 790701 DATE WRITTEN
  45. C 891214 Prologue converted to Version 4.0 format. (BAB)
  46. C 900328 Added TYPE section. (WRB)
  47. C 910408 Updated the AUTHOR section. (WRB)
  48. C***END PROLOGUE LPDP
  49. C
  50. C SUBROUTINES CALLED
  51. C
  52. C WNNLS SOLVES A NONNEGATIVELY CONSTRAINED LINEAR LEAST
  53. C SQUARES PROBLEM WITH LINEAR EQUALITY CONSTRAINTS.
  54. C PART OF THIS PACKAGE.
  55. C
  56. C++
  57. C SDOT, SUBROUTINES FROM THE BLAS PACKAGE.
  58. C SSCAL,SNRM2, SEE TRANS. MATH. SOFT., VOL. 5, NO. 3, P. 308.
  59. C SCOPY
  60. C
  61. REAL A(MDA,*), PRGOPT(*), WS(*), WNORM, X(*)
  62. INTEGER IS(*)
  63. REAL FAC, ONE, RNORM, SC, YNORM, ZERO
  64. REAL SDOT, SNRM2
  65. SAVE ZERO, ONE, FAC
  66. DATA ZERO, ONE /0.E0,1.E0/, FAC /0.1E0/
  67. C***FIRST EXECUTABLE STATEMENT LPDP
  68. N = N1 + N2
  69. MODE = 1
  70. IF (.NOT.(M.LE.0)) GO TO 20
  71. IF (.NOT.(N.GT.0)) GO TO 10
  72. X(1) = ZERO
  73. CALL SCOPY(N, X, 0, X, 1)
  74. 10 WNORM = ZERO
  75. RETURN
  76. 20 NP1 = N + 1
  77. C
  78. C SCALE NONZERO ROWS OF INEQUALITY MATRIX TO HAVE LENGTH ONE.
  79. DO 40 I=1,M
  80. SC = SNRM2(N,A(I,1),MDA)
  81. IF (.NOT.(SC.NE.ZERO)) GO TO 30
  82. SC = ONE/SC
  83. CALL SSCAL(NP1, SC, A(I,1), MDA)
  84. 30 CONTINUE
  85. 40 CONTINUE
  86. C
  87. C SCALE RT.-SIDE VECTOR TO HAVE LENGTH ONE (OR ZERO).
  88. YNORM = SNRM2(M,A(1,NP1),1)
  89. IF (.NOT.(YNORM.NE.ZERO)) GO TO 50
  90. SC = ONE/YNORM
  91. CALL SSCAL(M, SC, A(1,NP1), 1)
  92. C
  93. C SCALE COLS OF MATRIX H.
  94. 50 J = N1 + 1
  95. 60 IF (.NOT.(J.LE.N)) GO TO 70
  96. SC = SNRM2(M,A(1,J),1)
  97. IF (SC.NE.ZERO) SC = ONE/SC
  98. CALL SSCAL(M, SC, A(1,J), 1)
  99. X(J) = SC
  100. J = J + 1
  101. GO TO 60
  102. 70 IF (.NOT.(N1.GT.0)) GO TO 130
  103. C
  104. C COPY TRANSPOSE OF (H G Y) TO WORK ARRAY WS(*).
  105. IW = 0
  106. DO 80 I=1,M
  107. C
  108. C MOVE COL OF TRANSPOSE OF H INTO WORK ARRAY.
  109. CALL SCOPY(N2, A(I,N1+1), MDA, WS(IW+1), 1)
  110. IW = IW + N2
  111. C
  112. C MOVE COL OF TRANSPOSE OF G INTO WORK ARRAY.
  113. CALL SCOPY(N1, A(I,1), MDA, WS(IW+1), 1)
  114. IW = IW + N1
  115. C
  116. C MOVE COMPONENT OF VECTOR Y INTO WORK ARRAY.
  117. WS(IW+1) = A(I,NP1)
  118. IW = IW + 1
  119. 80 CONTINUE
  120. WS(IW+1) = ZERO
  121. CALL SCOPY(N, WS(IW+1), 0, WS(IW+1), 1)
  122. IW = IW + N
  123. WS(IW+1) = ONE
  124. IW = IW + 1
  125. C
  126. C SOLVE EU=F SUBJECT TO (TRANSPOSE OF H)U=0, U.GE.0. THE
  127. C MATRIX E = TRANSPOSE OF (G Y), AND THE (N+1)-VECTOR
  128. C F = TRANSPOSE OF (0,...,0,1).
  129. IX = IW + 1
  130. IW = IW + M
  131. C
  132. C DO NOT CHECK LENGTHS OF WORK ARRAYS IN THIS USAGE OF WNNLS( ).
  133. IS(1) = 0
  134. IS(2) = 0
  135. CALL WNNLS(WS, NP1, N2, NP1-N2, M, 0, PRGOPT, WS(IX), RNORM,
  136. 1 MODEW, IS, WS(IW+1))
  137. C
  138. C COMPUTE THE COMPONENTS OF THE SOLN DENOTED ABOVE BY W.
  139. SC = ONE - SDOT(M,A(1,NP1),1,WS(IX),1)
  140. IF (.NOT.(ONE+FAC*ABS(SC).NE.ONE .AND. RNORM.GT.ZERO)) GO TO 110
  141. SC = ONE/SC
  142. DO 90 J=1,N1
  143. X(J) = SC*SDOT(M,A(1,J),1,WS(IX),1)
  144. 90 CONTINUE
  145. C
  146. C COMPUTE THE VECTOR Q=Y-GW. OVERWRITE Y WITH THIS VECTOR.
  147. DO 100 I=1,M
  148. A(I,NP1) = A(I,NP1) - SDOT(N1,A(I,1),MDA,X,1)
  149. 100 CONTINUE
  150. GO TO 120
  151. 110 MODE = 2
  152. RETURN
  153. 120 CONTINUE
  154. 130 IF (.NOT.(N2.GT.0)) GO TO 180
  155. C
  156. C COPY TRANSPOSE OF (H Q) TO WORK ARRAY WS(*).
  157. IW = 0
  158. DO 140 I=1,M
  159. CALL SCOPY(N2, A(I,N1+1), MDA, WS(IW+1), 1)
  160. IW = IW + N2
  161. WS(IW+1) = A(I,NP1)
  162. IW = IW + 1
  163. 140 CONTINUE
  164. WS(IW+1) = ZERO
  165. CALL SCOPY(N2, WS(IW+1), 0, WS(IW+1), 1)
  166. IW = IW + N2
  167. WS(IW+1) = ONE
  168. IW = IW + 1
  169. IX = IW + 1
  170. IW = IW + M
  171. C
  172. C SOLVE RV=S SUBJECT TO V.GE.0. THE MATRIX R =(TRANSPOSE
  173. C OF (H Q)), WHERE Q=Y-GW. THE (N2+1)-VECTOR S =(TRANSPOSE
  174. C OF (0,...,0,1)).
  175. C
  176. C DO NOT CHECK LENGTHS OF WORK ARRAYS IN THIS USAGE OF WNNLS( ).
  177. IS(1) = 0
  178. IS(2) = 0
  179. CALL WNNLS(WS, N2+1, 0, N2+1, M, 0, PRGOPT, WS(IX), RNORM, MODEW,
  180. 1 IS, WS(IW+1))
  181. C
  182. C COMPUTE THE COMPONENTS OF THE SOLN DENOTED ABOVE BY Z.
  183. SC = ONE - SDOT(M,A(1,NP1),1,WS(IX),1)
  184. IF (.NOT.(ONE+FAC*ABS(SC).NE.ONE .AND. RNORM.GT.ZERO)) GO TO 160
  185. SC = ONE/SC
  186. DO 150 J=1,N2
  187. L = N1 + J
  188. X(L) = SC*SDOT(M,A(1,L),1,WS(IX),1)*X(L)
  189. 150 CONTINUE
  190. GO TO 170
  191. 160 MODE = 2
  192. RETURN
  193. 170 CONTINUE
  194. C
  195. C ACCOUNT FOR SCALING OF RT.-SIDE VECTOR IN SOLUTION.
  196. 180 CALL SSCAL(N, YNORM, X, 1)
  197. WNORM = SNRM2(N1,X,1)
  198. RETURN
  199. END