lsi.f 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. *DECK LSI
  2. SUBROUTINE LSI (W, MDW, MA, MG, N, PRGOPT, X, RNORM, MODE, WS, IP)
  3. C***BEGIN PROLOGUE LSI
  4. C***SUBSIDIARY
  5. C***PURPOSE Subsidiary to LSEI
  6. C***LIBRARY SLATEC
  7. C***TYPE SINGLE PRECISION (LSI-S, DLSI-D)
  8. C***AUTHOR Hanson, R. J., (SNLA)
  9. C***DESCRIPTION
  10. C
  11. C This is a companion subprogram to LSEI. The documentation for
  12. C LSEI has complete usage instructions.
  13. C
  14. C Solve..
  15. C AX = B, A MA by N (least squares equations)
  16. C subject to..
  17. C
  18. C GX.GE.H, G MG by N (inequality constraints)
  19. C
  20. C Input..
  21. C
  22. C W(*,*) contains (A B) in rows 1,...,MA+MG, cols 1,...,N+1.
  23. C (G H)
  24. C
  25. C MDW,MA,MG,N
  26. C contain (resp) var. dimension of W(*,*),
  27. C and matrix dimensions.
  28. C
  29. C PRGOPT(*),
  30. C Program option vector.
  31. C
  32. C OUTPUT..
  33. C
  34. C X(*),RNORM
  35. C
  36. C Solution vector(unless MODE=2), length of AX-B.
  37. C
  38. C MODE
  39. C =0 Inequality constraints are compatible.
  40. C =2 Inequality constraints contradictory.
  41. C
  42. C WS(*),
  43. C Working storage of dimension K+N+(MG+2)*(N+7),
  44. C where K=MAX(MA+MG,N).
  45. C IP(MG+2*N+1)
  46. C Integer working storage
  47. C
  48. C***ROUTINES CALLED H12, HFTI, LPDP, R1MACH, SASUM, SAXPY, SCOPY, SDOT,
  49. C SSCAL, SSWAP
  50. C***REVISION HISTORY (YYMMDD)
  51. C 790701 DATE WRITTEN
  52. C 890531 Changed all specific intrinsics to generic. (WRB)
  53. C 890618 Completely restructured and extensively revised (WRB & RWC)
  54. C 891214 Prologue converted to Version 4.0 format. (BAB)
  55. C 900328 Added TYPE section. (WRB)
  56. C 920422 Changed CALL to HFTI to include variable MA. (WRB)
  57. C***END PROLOGUE LSI
  58. INTEGER IP(*), MA, MDW, MG, MODE, N
  59. REAL PRGOPT(*), RNORM, W(MDW,*), WS(*), X(*)
  60. C
  61. EXTERNAL H12, HFTI, LPDP, R1MACH, SASUM, SAXPY, SCOPY, SDOT,
  62. * SSCAL, SSWAP
  63. REAL R1MACH, SASUM, SDOT
  64. C
  65. REAL ANORM, FAC, GAM, RB, SRELPR, TAU, TOL, XNORM
  66. INTEGER I, J, K, KEY, KRANK, KRM1, KRP1, L, LAST, LINK, M, MAP1,
  67. * MDLPDP, MINMAN, N1, N2, N3, NEXT, NP1
  68. LOGICAL COV, FIRST, SCLCOV
  69. C
  70. SAVE SRELPR, FIRST
  71. DATA FIRST /.TRUE./
  72. C
  73. C***FIRST EXECUTABLE STATEMENT LSI
  74. C
  75. C Set the nominal tolerance used in the code.
  76. C
  77. IF (FIRST) SRELPR = R1MACH(4)
  78. FIRST = .FALSE.
  79. TOL = SQRT(SRELPR)
  80. C
  81. MODE = 0
  82. RNORM = 0.E0
  83. M = MA + MG
  84. NP1 = N + 1
  85. KRANK = 0
  86. IF (N.LE.0 .OR. M.LE.0) GO TO 370
  87. C
  88. C To process option vector.
  89. C
  90. COV = .FALSE.
  91. SCLCOV = .TRUE.
  92. LAST = 1
  93. LINK = PRGOPT(1)
  94. C
  95. 100 IF (LINK.GT.1) THEN
  96. KEY = PRGOPT(LAST+1)
  97. IF (KEY.EQ.1) COV = PRGOPT(LAST+2) .NE. 0.E0
  98. IF (KEY.EQ.10) SCLCOV = PRGOPT(LAST+2) .EQ. 0.E0
  99. IF (KEY.EQ.5) TOL = MAX(SRELPR,PRGOPT(LAST+2))
  100. NEXT = PRGOPT(LINK)
  101. LAST = LINK
  102. LINK = NEXT
  103. GO TO 100
  104. ENDIF
  105. C
  106. C Compute matrix norm of least squares equations.
  107. C
  108. ANORM = 0.E0
  109. DO 110 J = 1,N
  110. ANORM = MAX(ANORM,SASUM(MA,W(1,J),1))
  111. 110 CONTINUE
  112. C
  113. C Set tolerance for HFTI( ) rank test.
  114. C
  115. TAU = TOL*ANORM
  116. C
  117. C Compute Householder orthogonal decomposition of matrix.
  118. C
  119. CALL SCOPY (N, 0.E0, 0, WS, 1)
  120. CALL SCOPY (MA, W(1, NP1), 1, WS, 1)
  121. K = MAX(M,N)
  122. MINMAN = MIN(MA,N)
  123. N1 = K + 1
  124. N2 = N1 + N
  125. CALL HFTI (W, MDW, MA, N, WS, MA, 1, TAU, KRANK, RNORM, WS(N2),
  126. + WS(N1), IP)
  127. FAC = 1.E0
  128. GAM = MA - KRANK
  129. IF (KRANK.LT.MA .AND. SCLCOV) FAC = RNORM**2/GAM
  130. C
  131. C Reduce to LPDP and solve.
  132. C
  133. MAP1 = MA + 1
  134. C
  135. C Compute inequality rt-hand side for LPDP.
  136. C
  137. IF (MA.LT.M) THEN
  138. IF (MINMAN.GT.0) THEN
  139. DO 120 I = MAP1,M
  140. W(I,NP1) = W(I,NP1) - SDOT(N,W(I,1),MDW,WS,1)
  141. 120 CONTINUE
  142. C
  143. C Apply permutations to col. of inequality constraint matrix.
  144. C
  145. DO 130 I = 1,MINMAN
  146. CALL SSWAP (MG, W(MAP1,I), 1, W(MAP1,IP(I)), 1)
  147. 130 CONTINUE
  148. C
  149. C Apply Householder transformations to constraint matrix.
  150. C
  151. IF (KRANK.GT.0 .AND. KRANK.LT.N) THEN
  152. DO 140 I = KRANK,1,-1
  153. CALL H12 (2, I, KRANK+1, N, W(I,1), MDW, WS(N1+I-1),
  154. + W(MAP1,1), MDW, 1, MG)
  155. 140 CONTINUE
  156. ENDIF
  157. C
  158. C Compute permuted inequality constraint matrix times r-inv.
  159. C
  160. DO 160 I = MAP1,M
  161. DO 150 J = 1,KRANK
  162. W(I,J) = (W(I,J)-SDOT(J-1,W(1,J),1,W(I,1),MDW))/W(J,J)
  163. 150 CONTINUE
  164. 160 CONTINUE
  165. ENDIF
  166. C
  167. C Solve the reduced problem with LPDP algorithm,
  168. C the least projected distance problem.
  169. C
  170. CALL LPDP(W(MAP1,1), MDW, MG, KRANK, N-KRANK, PRGOPT, X,
  171. + XNORM, MDLPDP, WS(N2), IP(N+1))
  172. C
  173. C Compute solution in original coordinates.
  174. C
  175. IF (MDLPDP.EQ.1) THEN
  176. DO 170 I = KRANK,1,-1
  177. X(I) = (X(I)-SDOT(KRANK-I,W(I,I+1),MDW,X(I+1),1))/W(I,I)
  178. 170 CONTINUE
  179. C
  180. C Apply Householder transformation to solution vector.
  181. C
  182. IF (KRANK.LT.N) THEN
  183. DO 180 I = 1,KRANK
  184. CALL H12 (2, I, KRANK+1, N, W(I,1), MDW, WS(N1+I-1),
  185. + X, 1, 1, 1)
  186. 180 CONTINUE
  187. ENDIF
  188. C
  189. C Repermute variables to their input order.
  190. C
  191. IF (MINMAN.GT.0) THEN
  192. DO 190 I = MINMAN,1,-1
  193. CALL SSWAP (1, X(I), 1, X(IP(I)), 1)
  194. 190 CONTINUE
  195. C
  196. C Variables are now in original coordinates.
  197. C Add solution of unconstrained problem.
  198. C
  199. DO 200 I = 1,N
  200. X(I) = X(I) + WS(I)
  201. 200 CONTINUE
  202. C
  203. C Compute the residual vector norm.
  204. C
  205. RNORM = SQRT(RNORM**2+XNORM**2)
  206. ENDIF
  207. ELSE
  208. MODE = 2
  209. ENDIF
  210. ELSE
  211. CALL SCOPY (N, WS, 1, X, 1)
  212. ENDIF
  213. C
  214. C Compute covariance matrix based on the orthogonal decomposition
  215. C from HFTI( ).
  216. C
  217. IF (.NOT.COV .OR. KRANK.LE.0) GO TO 370
  218. KRM1 = KRANK - 1
  219. KRP1 = KRANK + 1
  220. C
  221. C Copy diagonal terms to working array.
  222. C
  223. CALL SCOPY (KRANK, W, MDW+1, WS(N2), 1)
  224. C
  225. C Reciprocate diagonal terms.
  226. C
  227. DO 210 J = 1,KRANK
  228. W(J,J) = 1.E0/W(J,J)
  229. 210 CONTINUE
  230. C
  231. C Invert the upper triangular QR factor on itself.
  232. C
  233. IF (KRANK.GT.1) THEN
  234. DO 230 I = 1,KRM1
  235. DO 220 J = I+1,KRANK
  236. W(I,J) = -SDOT(J-I,W(I,I),MDW,W(I,J),1)*W(J,J)
  237. 220 CONTINUE
  238. 230 CONTINUE
  239. ENDIF
  240. C
  241. C Compute the inverted factor times its transpose.
  242. C
  243. DO 250 I = 1,KRANK
  244. DO 240 J = I,KRANK
  245. W(I,J) = SDOT(KRANK+1-J,W(I,J),MDW,W(J,J),MDW)
  246. 240 CONTINUE
  247. 250 CONTINUE
  248. C
  249. C Zero out lower trapezoidal part.
  250. C Copy upper triangular to lower triangular part.
  251. C
  252. IF (KRANK.LT.N) THEN
  253. DO 260 J = 1,KRANK
  254. CALL SCOPY (J, W(1,J), 1, W(J,1), MDW)
  255. 260 CONTINUE
  256. C
  257. DO 270 I = KRP1,N
  258. CALL SCOPY (I, 0.E0, 0, W(I,1), MDW)
  259. 270 CONTINUE
  260. C
  261. C Apply right side transformations to lower triangle.
  262. C
  263. N3 = N2 + KRP1
  264. DO 330 I = 1,KRANK
  265. L = N1 + I
  266. K = N2 + I
  267. RB = WS(L-1)*WS(K-1)
  268. C
  269. C If RB.GE.0.E0, transformation can be regarded as zero.
  270. C
  271. IF (RB.LT.0.E0) THEN
  272. RB = 1.E0/RB
  273. C
  274. C Store unscaled rank one Householder update in work array.
  275. C
  276. CALL SCOPY (N, 0.E0, 0, WS(N3), 1)
  277. L = N1 + I
  278. K = N3 + I
  279. WS(K-1) = WS(L-1)
  280. C
  281. DO 280 J = KRP1,N
  282. WS(N3+J-1) = W(I,J)
  283. 280 CONTINUE
  284. C
  285. DO 290 J = 1,N
  286. WS(J) = RB*(SDOT(J-I,W(J,I),MDW,WS(N3+I-1),1)+
  287. + SDOT(N-J+1,W(J,J),1,WS(N3+J-1),1))
  288. 290 CONTINUE
  289. C
  290. L = N3 + I
  291. GAM = 0.5E0*RB*SDOT(N-I+1,WS(L-1),1,WS(I),1)
  292. CALL SAXPY (N-I+1, GAM, WS(L-1), 1, WS(I), 1)
  293. DO 320 J = I,N
  294. DO 300 L = 1,I-1
  295. W(J,L) = W(J,L) + WS(N3+J-1)*WS(L)
  296. 300 CONTINUE
  297. C
  298. DO 310 L = I,J
  299. W(J,L) = W(J,L) + WS(J)*WS(N3+L-1)+WS(L)*WS(N3+J-1)
  300. 310 CONTINUE
  301. 320 CONTINUE
  302. ENDIF
  303. 330 CONTINUE
  304. C
  305. C Copy lower triangle to upper triangle to symmetrize the
  306. C covariance matrix.
  307. C
  308. DO 340 I = 1,N
  309. CALL SCOPY (I, W(I,1), MDW, W(1,I), 1)
  310. 340 CONTINUE
  311. ENDIF
  312. C
  313. C Repermute rows and columns.
  314. C
  315. DO 350 I = MINMAN,1,-1
  316. K = IP(I)
  317. IF (I.NE.K) THEN
  318. CALL SSWAP (1, W(I,I), 1, W(K,K), 1)
  319. CALL SSWAP (I-1, W(1,I), 1, W(1,K), 1)
  320. CALL SSWAP (K-I-1, W(I,I+1), MDW, W(I+1,K), 1)
  321. CALL SSWAP (N-K, W(I, K+1), MDW, W(K, K+1), MDW)
  322. ENDIF
  323. 350 CONTINUE
  324. C
  325. C Put in normalized residual sum of squares scale factor
  326. C and symmetrize the resulting covariance matrix.
  327. C
  328. DO 360 J = 1,N
  329. CALL SSCAL (J, FAC, W(1,J), 1)
  330. CALL SCOPY (J, W(1,J), 1, W(J,1), MDW)
  331. 360 CONTINUE
  332. C
  333. 370 IP(1) = KRANK
  334. IP(2) = N + MAX(M,N) + (MG+2)*(N+7)
  335. RETURN
  336. END