dplpmu.f 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433
  1. *DECK DPLPMU
  2. SUBROUTINE DPLPMU (MRELAS, NVARS, LMX, LBM, NREDC, INFO, IENTER,
  3. + ILEAVE, IOPT, NPP, JSTRT, IBASIS, IMAT, IBRC, IPR, IWR, IND,
  4. + IBB, ANORM, EPS, UU, GG, RPRNRM, ERDNRM, DULNRM, THETA, COSTSC,
  5. + XLAMDA, RHSNRM, AMAT, BASMAT, CSC, WR, RPRIM, WW, BU, BL, RHS,
  6. + ERD, ERP, RZ, RG, COLNRM, COSTS, PRIMAL, DUALS, SINGLR, REDBAS,
  7. + ZEROLV, STPEDG)
  8. C***BEGIN PROLOGUE DPLPMU
  9. C***SUBSIDIARY
  10. C***PURPOSE Subsidiary to DSPLP
  11. C***LIBRARY SLATEC
  12. C***TYPE DOUBLE PRECISION (SPLPMU-S, DPLPMU-D)
  13. C***AUTHOR (UNKNOWN)
  14. C***DESCRIPTION
  15. C
  16. C THE EDITING REQUIRED TO CONVERT THIS SUBROUTINE FROM SINGLE TO
  17. C DOUBLE PRECISION INVOLVES THE FOLLOWING CHARACTER STRING CHANGES.
  18. C
  19. C USE AN EDITING COMMAND (CHANGE) /STRING-1/(TO)STRING-2/.
  20. C /REAL (12 BLANKS)/DOUBLE PRECISION/,
  21. C /SASUM/DASUM/,/SCOPY/DCOPY/,/SDOT/DDOT/,
  22. C /.E0/.D0/
  23. C
  24. C THIS SUBPROGRAM IS FROM THE DSPLP( ) PACKAGE. IT PERFORMS THE
  25. C TASKS OF UPDATING THE PRIMAL SOLUTION, EDGE WEIGHTS, REDUCED
  26. C COSTS, AND MATRIX DECOMPOSITION.
  27. C IT IS THE MAIN PART OF THE PROCEDURE (MAKE MOVE AND UPDATE).
  28. C
  29. C REVISED 821122-1100
  30. C REVISED YYMMDD
  31. C
  32. C***SEE ALSO DSPLP
  33. C***ROUTINES CALLED DASUM, DCOPY, DDOT, DPLPDM, DPNNZR, DPRWPG, IDLOC,
  34. C LA05BD, LA05CD, XERMSG
  35. C***REVISION HISTORY (YYMMDD)
  36. C 811215 DATE WRITTEN
  37. C 890531 Changed all specific intrinsics to generic. (WRB)
  38. C 890605 Removed unreferenced labels. (WRB)
  39. C 890606 Changed references from IPLOC to IDLOC. (WRB)
  40. C 890606 Removed unused COMMON block LA05DD. (WRB)
  41. C 891214 Prologue converted to Version 4.0 format. (BAB)
  42. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  43. C 900328 Added TYPE section. (WRB)
  44. C***END PROLOGUE DPLPMU
  45. INTEGER IBASIS(*),IMAT(*),IBRC(LBM,2),IPR(*),IWR(*),IND(*),IBB(*)
  46. DOUBLE PRECISION AIJ,ALPHA,ANORM,COSTSC,ERDNRM,DULNRM,EPS,GAMMA,
  47. * GG,GQ,ONE,RPRNRM,RZJ,SCALR,THETA,TWO,UU,WP,XLAMDA,RHSNRM,
  48. * ZERO,AMAT(*),BASMAT(*),CSC(*),WR(*),RPRIM(*),WW(*),BU(*),BL(*),
  49. * RHS(*),ERD(*),ERP(*),RZ(*),RG(*),COSTS(*),PRIMAL(*),DUALS(*),
  50. * COLNRM(*),RCOST,DASUM,DDOT,CNORM
  51. LOGICAL SINGLR,REDBAS,PAGEPL,TRANS,ZEROLV,STPEDG
  52. C
  53. C***FIRST EXECUTABLE STATEMENT DPLPMU
  54. ZERO=0.D0
  55. ONE=1.D0
  56. TWO=2.D0
  57. LPG=LMX-(NVARS+4)
  58. C
  59. C UPDATE THE PRIMAL SOLUTION WITH A MULTIPLE OF THE SEARCH
  60. C DIRECTION.
  61. I=1
  62. N20002=MRELAS
  63. GO TO 20003
  64. 20002 I=I+1
  65. 20003 IF ((N20002-I).LT.0) GO TO 20004
  66. RPRIM(I)=RPRIM(I)-THETA*WW(I)
  67. GO TO 20002
  68. C
  69. C IF EJECTED VARIABLE IS LEAVING AT AN UPPER BOUND, THEN
  70. C TRANSLATE RIGHT HAND SIDE.
  71. 20004 IF (.NOT.(ILEAVE.LT.0)) GO TO 20006
  72. IBAS=IBASIS(ABS(ILEAVE))
  73. SCALR=RPRIM(ABS(ILEAVE))
  74. ASSIGN 20009 TO NPR001
  75. GO TO 30001
  76. 20009 IBB(IBAS)=ABS(IBB(IBAS))+1
  77. C
  78. C IF ENTERING VARIABLE IS RESTRICTED TO ITS UPPER BOUND, TRANSLATE
  79. C RIGHT HAND SIDE. IF THE VARIABLE DECREASED FROM ITS UPPER
  80. C BOUND, A SIGN CHANGE IS REQUIRED IN THE TRANSLATION.
  81. 20006 IF (.NOT.(IENTER.EQ.ILEAVE)) GO TO 20010
  82. IBAS=IBASIS(IENTER)
  83. SCALR=THETA
  84. IF (MOD(IBB(IBAS),2).EQ.0) SCALR=-SCALR
  85. ASSIGN 20013 TO NPR001
  86. GO TO 30001
  87. 20013 IBB(IBAS)=IBB(IBAS)+1
  88. GO TO 20011
  89. 20010 IBAS=IBASIS(IENTER)
  90. C
  91. C IF ENTERING VARIABLE IS DECREASING FROM ITS UPPER BOUND,
  92. C COMPLEMENT ITS PRIMAL VALUE.
  93. IF (.NOT.(IND(IBAS).EQ.3.AND.MOD(IBB(IBAS),2).EQ.0)) GO TO 20014
  94. SCALR=-(BU(IBAS)-BL(IBAS))
  95. IF (IBAS.LE.NVARS) SCALR=SCALR/CSC(IBAS)
  96. ASSIGN 20017 TO NPR001
  97. GO TO 30001
  98. 20017 THETA=-SCALR-THETA
  99. IBB(IBAS)=IBB(IBAS)+1
  100. 20014 CONTINUE
  101. RPRIM(ABS(ILEAVE))=THETA
  102. IBB(IBAS)=-ABS(IBB(IBAS))
  103. I=IBASIS(ABS(ILEAVE))
  104. IBB(I)=ABS(IBB(I))
  105. IF(PRIMAL(ABS(ILEAVE)+NVARS).GT.ZERO) IBB(I)=IBB(I)+1
  106. C
  107. C INTERCHANGE COLUMN POINTERS TO NOTE EXCHANGE OF COLUMNS.
  108. 20011 IBAS=IBASIS(IENTER)
  109. IBASIS(IENTER)=IBASIS(ABS(ILEAVE))
  110. IBASIS(ABS(ILEAVE))=IBAS
  111. C
  112. C IF VARIABLE WAS EXCHANGED AT A ZERO LEVEL, MARK IT SO THAT
  113. C IT CAN'T BE BROUGHT BACK IN. THIS IS TO HELP PREVENT CYCLING.
  114. IF(ZEROLV) IBASIS(IENTER)=-ABS(IBASIS(IENTER))
  115. RPRNRM=MAX(RPRNRM,DASUM(MRELAS,RPRIM,1))
  116. K=1
  117. N20018=MRELAS
  118. GO TO 20019
  119. 20018 K=K+1
  120. 20019 IF ((N20018-K).LT.0) GO TO 20020
  121. C
  122. C SEE IF VARIABLES THAT WERE CLASSIFIED AS INFEASIBLE HAVE NOW
  123. C BECOME FEASIBLE. THIS MAY REQUIRED TRANSLATING UPPER BOUNDED
  124. C VARIABLES.
  125. IF (.NOT.(PRIMAL(K+NVARS).NE.ZERO .AND.
  126. * ABS(RPRIM(K)).LE.RPRNRM*ERP(K))) GO TO 20022
  127. IF (.NOT.(PRIMAL(K+NVARS).GT.ZERO)) GO TO 20025
  128. IBAS=IBASIS(K)
  129. SCALR=-(BU(IBAS)-BL(IBAS))
  130. IF(IBAS.LE.NVARS)SCALR=SCALR/CSC(IBAS)
  131. ASSIGN 20028 TO NPR001
  132. GO TO 30001
  133. 20028 RPRIM(K)=-SCALR
  134. RPRNRM=RPRNRM-SCALR
  135. 20025 PRIMAL(K+NVARS)=ZERO
  136. 20022 CONTINUE
  137. GO TO 20018
  138. C
  139. C UPDATE REDUCED COSTS, EDGE WEIGHTS, AND MATRIX DECOMPOSITION.
  140. 20020 IF (.NOT.(IENTER.NE.ILEAVE)) GO TO 20029
  141. C
  142. C THE INCOMING VARIABLE IS ALWAYS CLASSIFIED AS FEASIBLE.
  143. PRIMAL(ABS(ILEAVE)+NVARS)=ZERO
  144. C
  145. WP=WW(ABS(ILEAVE))
  146. GQ=DDOT(MRELAS,WW,1,WW,1)+ONE
  147. C
  148. C COMPUTE INVERSE (TRANSPOSE) TIMES SEARCH DIRECTION.
  149. TRANS=.TRUE.
  150. CALL LA05BD(BASMAT,IBRC,LBM,MRELAS,IPR,IWR,WR,GG,WW,TRANS)
  151. C
  152. C UPDATE THE MATRIX DECOMPOSITION. COL. ABS(ILEAVE) IS LEAVING.
  153. C THE ARRAY DUALS(*) CONTAINS INTERMEDIATE RESULTS FOR THE
  154. C INCOMING COLUMN.
  155. CALL LA05CD(BASMAT,IBRC,LBM,MRELAS,IPR,IWR,DUALS,GG,UU,
  156. * ABS(ILEAVE))
  157. REDBAS=.FALSE.
  158. IF (.NOT.(GG.LT.ZERO)) GO TO 20032
  159. C
  160. C REDECOMPOSE BASIS MATRIX WHEN AN ERROR RETURN FROM
  161. C LA05CD( ) IS NOTED. THIS WILL PROBABLY BE DUE TO
  162. C SPACE BEING EXHAUSTED, GG=-7.
  163. CALL DPLPDM(
  164. *MRELAS,NVARS,LMX,LBM,NREDC,INFO,IOPT,
  165. *IBASIS,IMAT,IBRC,IPR,IWR,IND,IBB,
  166. *ANORM,EPS,UU,GG,
  167. *AMAT,BASMAT,CSC,WR,
  168. *SINGLR,REDBAS)
  169. IF (.NOT.(SINGLR)) GO TO 20035
  170. NERR=26
  171. CALL XERMSG ('SLATEC', 'DPLPMU',
  172. + 'IN DSPLP, MOVED TO A SINGULAR POINT. THIS SHOULD NOT HAPPEN.',
  173. + NERR, IOPT)
  174. INFO=-NERR
  175. RETURN
  176. 20035 CONTINUE
  177. GO TO 30002
  178. 20038 CONTINUE
  179. 20032 CONTINUE
  180. C
  181. C IF STEEPEST EDGE PRICING IS USED, UPDATE REDUCED COSTS
  182. C AND EDGE WEIGHTS.
  183. IF (.NOT.(STPEDG)) GO TO 20039
  184. C
  185. C COMPUTE COL. ABS(ILEAVE) OF THE NEW INVERSE (TRANSPOSE) MATRIX
  186. C HERE ABS(ILEAVE) POINTS TO THE EJECTED COLUMN.
  187. C USE ERD(*) FOR TEMP. STORAGE.
  188. CALL DCOPY(MRELAS,ZERO,0,ERD,1)
  189. ERD(ABS(ILEAVE))=ONE
  190. TRANS=.TRUE.
  191. CALL LA05BD(BASMAT,IBRC,LBM,MRELAS,IPR,IWR,WR,GG,ERD,TRANS)
  192. C
  193. C COMPUTE UPDATED DUAL VARIABLES IN DUALS(*).
  194. ASSIGN 20042 TO NPR003
  195. GO TO 30003
  196. C
  197. C COMPUTE THE DOT PRODUCT OF COL. J OF THE NEW INVERSE (TRANSPOSE)
  198. C WITH EACH NON-BASIC COLUMN. ALSO COMPUTE THE DOT PRODUCT OF THE
  199. C INVERSE (TRANSPOSE) OF NON-UPDATED MATRIX (TIMES) THE
  200. C SEARCH DIRECTION WITH EACH NON-BASIC COLUMN.
  201. C RECOMPUTE REDUCED COSTS.
  202. 20042 PAGEPL=.TRUE.
  203. CALL DCOPY(NVARS+MRELAS,ZERO,0,RZ,1)
  204. NNEGRC=0
  205. J=JSTRT
  206. 20043 IF (.NOT.(IBB(J).LE.0)) GO TO 20045
  207. PAGEPL=.TRUE.
  208. RG(J)=ONE
  209. GO TO 20046
  210. C
  211. C NONBASIC INDEPENDENT VARIABLES (COLUMN IN SPARSE MATRIX STORAGE)
  212. 20045 IF (.NOT.(J.LE.NVARS)) GO TO 20048
  213. RZJ=COSTS(J)*COSTSC
  214. ALPHA=ZERO
  215. GAMMA=ZERO
  216. C
  217. C COMPUTE THE DOT PRODUCT OF THE SPARSE MATRIX NONBASIC COLUMNS
  218. C WITH THREE VECTORS INVOLVED IN THE UPDATING STEP.
  219. IF (.NOT.(J.EQ.1)) GO TO 20051
  220. ILOW=NVARS+5
  221. GO TO 20052
  222. 20051 ILOW=IMAT(J+3)+1
  223. 20052 IF (.NOT.(PAGEPL)) GO TO 20054
  224. IL1=IDLOC(ILOW,AMAT,IMAT)
  225. IF (.NOT.(IL1.GE.LMX-1)) GO TO 20057
  226. ILOW=ILOW+2
  227. IL1=IDLOC(ILOW,AMAT,IMAT)
  228. 20057 CONTINUE
  229. IPAGE=ABS(IMAT(LMX-1))
  230. GO TO 20055
  231. 20054 IL1=IHI+1
  232. 20055 IHI=IMAT(J+4)-(ILOW-IL1)
  233. 20060 IU1=MIN(LMX-2,IHI)
  234. IF (.NOT.(IL1.GT.IU1)) GO TO 20062
  235. GO TO 20061
  236. 20062 CONTINUE
  237. DO 10 I=IL1,IU1
  238. RZJ=RZJ-AMAT(I)*DUALS(IMAT(I))
  239. ALPHA=ALPHA+AMAT(I)*ERD(IMAT(I))
  240. GAMMA=GAMMA+AMAT(I)*WW(IMAT(I))
  241. 10 CONTINUE
  242. IF (.NOT.(IHI.LE.LMX-2)) GO TO 20065
  243. GO TO 20061
  244. 20065 CONTINUE
  245. IPAGE=IPAGE+1
  246. KEY=1
  247. CALL DPRWPG(KEY,IPAGE,LPG,AMAT,IMAT)
  248. IL1=NVARS+5
  249. IHI=IHI-LPG
  250. GO TO 20060
  251. 20061 PAGEPL=IHI.EQ.(LMX-2)
  252. RZ(J)=RZJ*CSC(J)
  253. ALPHA=ALPHA*CSC(J)
  254. GAMMA=GAMMA*CSC(J)
  255. RG(J)=MAX(RG(J)-TWO*ALPHA*GAMMA+ALPHA**2*GQ,ONE+ALPHA**2)
  256. C
  257. C NONBASIC DEPENDENT VARIABLES (COLUMNS DEFINED IMPLICITLY)
  258. GO TO 20049
  259. 20048 PAGEPL=.TRUE.
  260. SCALR=-ONE
  261. IF(IND(J).EQ.2) SCALR=ONE
  262. I=J-NVARS
  263. ALPHA=SCALR*ERD(I)
  264. RZ(J)=-SCALR*DUALS(I)
  265. GAMMA=SCALR*WW(I)
  266. RG(J)=MAX(RG(J)-TWO*ALPHA*GAMMA+ALPHA**2*GQ,ONE+ALPHA**2)
  267. 20049 CONTINUE
  268. 20046 CONTINUE
  269. C
  270. RCOST=RZ(J)
  271. IF (MOD(IBB(J),2).EQ.0) RCOST=-RCOST
  272. IF (.NOT.(IND(J).EQ.3)) GO TO 20068
  273. IF(BU(J).EQ.BL(J)) RCOST=ZERO
  274. 20068 CONTINUE
  275. IF (IND(J).EQ.4) RCOST=-ABS(RCOST)
  276. CNORM=ONE
  277. IF (J.LE.NVARS) CNORM=COLNRM(J)
  278. IF (RCOST+ERDNRM*DULNRM*CNORM.LT.ZERO) NNEGRC=NNEGRC+1
  279. J=MOD(J,MRELAS+NVARS)+1
  280. IF (.NOT.(NNEGRC.GE.NPP .OR. J.EQ.JSTRT)) GO TO 20071
  281. GO TO 20044
  282. 20071 CONTINUE
  283. GO TO 20043
  284. 20044 JSTRT=J
  285. C
  286. C UPDATE THE EDGE WEIGHT FOR THE EJECTED VARIABLE.
  287. RG(ABS(IBASIS(IENTER)))= GQ/WP**2
  288. C
  289. C IF MINIMUM REDUCED COST (DANTZIG) PRICING IS USED,
  290. C CALCULATE THE NEW REDUCED COSTS.
  291. GO TO 20040
  292. C
  293. C COMPUTE THE UPDATED DUALS IN DUALS(*).
  294. 20039 ASSIGN 20074 TO NPR003
  295. GO TO 30003
  296. 20074 CALL DCOPY(NVARS+MRELAS,ZERO,0,RZ,1)
  297. NNEGRC=0
  298. J=JSTRT
  299. PAGEPL=.TRUE.
  300. C
  301. 20075 IF (.NOT.(IBB(J).LE.0)) GO TO 20077
  302. PAGEPL=.TRUE.
  303. GO TO 20078
  304. C
  305. C NONBASIC INDEPENDENT VARIABLE (COLUMN IN SPARSE MATRIX STORAGE)
  306. 20077 IF (.NOT.(J.LE.NVARS)) GO TO 20080
  307. RZ(J)=COSTS(J)*COSTSC
  308. IF (.NOT.(J.EQ.1)) GO TO 20083
  309. ILOW=NVARS+5
  310. GO TO 20084
  311. 20083 ILOW=IMAT(J+3)+1
  312. 20084 CONTINUE
  313. IF (.NOT.(PAGEPL)) GO TO 20086
  314. IL1=IDLOC(ILOW,AMAT,IMAT)
  315. IF (.NOT.(IL1.GE.LMX-1)) GO TO 20089
  316. ILOW=ILOW+2
  317. IL1=IDLOC(ILOW,AMAT,IMAT)
  318. 20089 CONTINUE
  319. IPAGE=ABS(IMAT(LMX-1))
  320. GO TO 20087
  321. 20086 IL1=IHI+1
  322. 20087 CONTINUE
  323. IHI=IMAT(J+4)-(ILOW-IL1)
  324. 20092 IU1=MIN(LMX-2,IHI)
  325. IF (.NOT.(IU1.GE.IL1 .AND.MOD(IU1-IL1,2).EQ.0)) GO TO 20094
  326. RZ(J)=RZ(J)-AMAT(IL1)*DUALS(IMAT(IL1))
  327. IL1=IL1+1
  328. 20094 CONTINUE
  329. IF (.NOT.(IL1.GT.IU1)) GO TO 20097
  330. GO TO 20093
  331. 20097 CONTINUE
  332. C
  333. C UNROLL THE DOT PRODUCT LOOP TO A DEPTH OF TWO. (THIS IS DONE
  334. C FOR INCREASED EFFICIENCY).
  335. DO 40 I=IL1,IU1,2
  336. RZ(J)=RZ(J)-AMAT(I)*DUALS(IMAT(I))-AMAT(I+1)*DUALS(IMAT(I+1))
  337. 40 CONTINUE
  338. IF (.NOT.(IHI.LE.LMX-2)) GO TO 20100
  339. GO TO 20093
  340. 20100 CONTINUE
  341. IPAGE=IPAGE+1
  342. KEY=1
  343. CALL DPRWPG(KEY,IPAGE,LPG,AMAT,IMAT)
  344. IL1=NVARS+5
  345. IHI=IHI-LPG
  346. GO TO 20092
  347. 20093 PAGEPL=IHI.EQ.(LMX-2)
  348. RZ(J)=RZ(J)*CSC(J)
  349. C
  350. C NONBASIC DEPENDENT VARIABLES (COLUMNS DEFINED IMPLICITLY)
  351. GO TO 20081
  352. 20080 PAGEPL=.TRUE.
  353. SCALR=-ONE
  354. IF(IND(J).EQ.2) SCALR=ONE
  355. I=J-NVARS
  356. RZ(J)=-SCALR*DUALS(I)
  357. 20081 CONTINUE
  358. 20078 CONTINUE
  359. C
  360. RCOST=RZ(J)
  361. IF (MOD(IBB(J),2).EQ.0) RCOST=-RCOST
  362. IF (.NOT.(IND(J).EQ.3)) GO TO 20103
  363. IF(BU(J).EQ.BL(J)) RCOST=ZERO
  364. 20103 CONTINUE
  365. IF (IND(J).EQ.4) RCOST=-ABS(RCOST)
  366. CNORM=ONE
  367. IF (J.LE.NVARS) CNORM=COLNRM(J)
  368. IF (RCOST+ERDNRM*DULNRM*CNORM.LT.ZERO) NNEGRC=NNEGRC+1
  369. J=MOD(J,MRELAS+NVARS)+1
  370. IF (.NOT.(NNEGRC.GE.NPP .OR. J.EQ.JSTRT)) GO TO 20106
  371. GO TO 20076
  372. 20106 CONTINUE
  373. GO TO 20075
  374. 20076 JSTRT=J
  375. 20040 CONTINUE
  376. GO TO 20030
  377. C
  378. C THIS IS NECESSARY ONLY FOR PRINTING OF INTERMEDIATE RESULTS.
  379. 20029 ASSIGN 20109 TO NPR003
  380. GO TO 30003
  381. 20109 CONTINUE
  382. 20030 RETURN
  383. C PROCEDURE (TRANSLATE RIGHT HAND SIDE)
  384. C
  385. C PERFORM THE TRANSLATION ON THE RIGHT-HAND SIDE.
  386. 30001 IF (.NOT.(IBAS.LE.NVARS)) GO TO 20110
  387. I=0
  388. 20113 CALL DPNNZR(I,AIJ,IPLACE,AMAT,IMAT,IBAS)
  389. IF (.NOT.(I.LE.0)) GO TO 20115
  390. GO TO 20114
  391. 20115 CONTINUE
  392. RHS(I)=RHS(I)-SCALR*AIJ*CSC(IBAS)
  393. GO TO 20113
  394. 20114 GO TO 20111
  395. 20110 I=IBAS-NVARS
  396. IF (.NOT.(IND(IBAS).EQ.2)) GO TO 20118
  397. RHS(I)=RHS(I)-SCALR
  398. GO TO 20119
  399. 20118 RHS(I)=RHS(I)+SCALR
  400. 20119 CONTINUE
  401. 20111 CONTINUE
  402. RHSNRM=MAX(RHSNRM,DASUM(MRELAS,RHS,1))
  403. GO TO NPR001, (20009,20013,20017,20028)
  404. C PROCEDURE (COMPUTE NEW PRIMAL)
  405. C
  406. C COPY RHS INTO WW(*), SOLVE SYSTEM.
  407. 30002 CALL DCOPY(MRELAS,RHS,1,WW,1)
  408. TRANS = .FALSE.
  409. CALL LA05BD(BASMAT,IBRC,LBM,MRELAS,IPR,IWR,WR,GG,WW,TRANS)
  410. CALL DCOPY(MRELAS,WW,1,RPRIM,1)
  411. RPRNRM=DASUM(MRELAS,RPRIM,1)
  412. GO TO 20038
  413. C PROCEDURE (COMPUTE NEW DUALS)
  414. C
  415. C SOLVE FOR DUAL VARIABLES. FIRST COPY COSTS INTO DUALS(*).
  416. 30003 I=1
  417. N20121=MRELAS
  418. GO TO 20122
  419. 20121 I=I+1
  420. 20122 IF ((N20121-I).LT.0) GO TO 20123
  421. J=IBASIS(I)
  422. IF (.NOT.(J.LE.NVARS)) GO TO 20125
  423. DUALS(I)=COSTSC*COSTS(J)*CSC(J) + XLAMDA*PRIMAL(I+NVARS)
  424. GO TO 20126
  425. 20125 DUALS(I)=XLAMDA*PRIMAL(I+NVARS)
  426. 20126 CONTINUE
  427. GO TO 20121
  428. C
  429. 20123 TRANS=.TRUE.
  430. CALL LA05BD(BASMAT,IBRC,LBM,MRELAS,IPR,IWR,WR,GG,DUALS,TRANS)
  431. DULNRM=DASUM(MRELAS,DUALS,1)
  432. GO TO NPR003, (20042,20074,20109)
  433. END