dplpmn.f 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988
  1. *DECK DPLPMN
  2. SUBROUTINE DPLPMN (DUSRMT, MRELAS, NVARS, COSTS, PRGOPT, DATTRV,
  3. + BL, BU, IND, INFO, PRIMAL, DUALS, AMAT, CSC, COLNRM, ERD, ERP,
  4. + BASMAT, WR, RZ, RG, RPRIM, RHS, WW, LMX, LBM, IBASIS, IBB,
  5. + IMAT, IBRC, IPR, IWR)
  6. C***BEGIN PROLOGUE DPLPMN
  7. C***SUBSIDIARY
  8. C***PURPOSE Subsidiary to DSPLP
  9. C***LIBRARY SLATEC
  10. C***TYPE DOUBLE PRECISION (SPLPMN-S, DPLPMN-D)
  11. C***AUTHOR (UNKNOWN)
  12. C***DESCRIPTION
  13. C
  14. C MARVEL OPTION(S).. OUTPUT=YES/NO TO ELIMINATE PRINTED OUTPUT.
  15. C THIS DOES NOT APPLY TO THE CALLS TO THE ERROR PROCESSOR.
  16. C
  17. C MAIN SUBROUTINE FOR DSPLP PACKAGE.
  18. C
  19. C***SEE ALSO DSPLP
  20. C***ROUTINES CALLED DASUM, DCOPY, DDOT, DPINCW, DPINIT, DPINTM, DPLPCE,
  21. C DPLPDM, DPLPFE, DPLPFL, DPLPMU, DPLPUP, DPNNZR,
  22. C DPOPT, DPRWPG, DVOUT, IVOUT, LA05BD, SCLOSM, XERMSG
  23. C***COMMON BLOCKS LA05DD
  24. C***REVISION HISTORY (YYMMDD)
  25. C 811215 DATE WRITTEN
  26. C 890531 Changed all specific intrinsics to generic. (WRB)
  27. C 890605 Removed unreferenced labels. (WRB)
  28. C 891009 Removed unreferenced variable. (WRB)
  29. C 891214 Prologue converted to Version 4.0 format. (BAB)
  30. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  31. C 900328 Added TYPE section. (WRB)
  32. C 900510 Convert XERRWV calls to XERMSG calls. (RWC)
  33. C***END PROLOGUE DPLPMN
  34. DOUBLE PRECISION ABIG,AIJ,AMAT(*),ANORM,ASMALL,BASMAT(*),
  35. * BL(*),BU(*),COLNRM(*),COSTS(*),COSTSC,CSC(*),DATTRV(*),
  36. * DIRNRM,DUALS(*),DULNRM,EPS,TUNE,ERD(*),ERDNRM,ERP(*),FACTOR,GG,
  37. * ONE,PRGOPT(*),PRIMAL(*),RESNRM,RG(*),RHS(*),RHSNRM,ROPT(07),
  38. * RPRIM(*),RPRNRM,RZ(*),RZJ,SCALR,SCOSTS,SIZE,SMALL,THETA,
  39. * TOLLS,UPBND,UU,WR(*),WW(*),XLAMDA,XVAL,ZERO,RDUM(01),TOLABS
  40. DOUBLE PRECISION DDOT,DASUM
  41. C
  42. INTEGER IBASIS(*),IBB(*),IBRC(LBM,2),IMAT(*),IND(*),
  43. * IPR(*),IWR(*),INTOPT(08),IDUM(01)
  44. C
  45. C ARRAY LOCAL VARIABLES
  46. C NAME(LENGTH) DESCRIPTION
  47. C
  48. C COSTS(NVARS) COST COEFFICIENTS
  49. C PRGOPT( ) OPTION VECTOR
  50. C DATTRV( ) DATA TRANSFER VECTOR
  51. C PRIMAL(NVARS+MRELAS) AS OUTPUT IT IS PRIMAL SOLUTION OF LP.
  52. C INTERNALLY, THE FIRST NVARS POSITIONS HOLD
  53. C THE COLUMN CHECK SUMS. THE NEXT MRELAS
  54. C POSITIONS HOLD THE CLASSIFICATION FOR THE
  55. C BASIC VARIABLES -1 VIOLATES LOWER
  56. C BOUND, 0 FEASIBLE, +1 VIOLATES UPPER BOUND
  57. C DUALS(MRELAS+NVARS) DUAL SOLUTION. INTERNALLY HOLDS R.H. SIDE
  58. C AS FIRST MRELAS ENTRIES.
  59. C AMAT(LMX) SPARSE FORM OF DATA MATRIX
  60. C IMAT(LMX) SPARSE FORM OF DATA MATRIX
  61. C BL(NVARS+MRELAS) LOWER BOUNDS FOR VARIABLES
  62. C BU(NVARS+MRELAS) UPPER BOUNDS FOR VARIABLES
  63. C IND(NVARS+MRELAS) INDICATOR FOR VARIABLES
  64. C CSC(NVARS) COLUMN SCALING
  65. C IBASIS(NVARS+MRELAS) COLS. 1-MRELAS ARE BASIC, REST ARE NON-BASIC
  66. C IBB(NVARS+MRELAS) INDICATOR FOR NON-BASIC VARS., POLARITY OF
  67. C VARS., AND POTENTIALLY INFINITE VARS.
  68. C IF IBB(J).LT.0, VARIABLE J IS BASIC
  69. C IF IBB(J).GT.0, VARIABLE J IS NON-BASIC
  70. C IF IBB(J).EQ.0, VARIABLE J HAS TO BE IGNORED
  71. C BECAUSE IT WOULD CAUSE UNBOUNDED SOLN.
  72. C WHEN MOD(IBB(J),2).EQ.0, VARIABLE IS AT ITS
  73. C UPPER BOUND, OTHERWISE IT IS AT ITS LOWER
  74. C BOUND
  75. C COLNRM(NVARS) NORM OF COLUMNS
  76. C ERD(MRELAS) ERRORS IN DUAL VARIABLES
  77. C ERP(MRELAS) ERRORS IN PRIMAL VARIABLES
  78. C BASMAT(LBM) BASIS MATRIX FOR HARWELL SPARSE CODE
  79. C IBRC(LBM,2) ROW AND COLUMN POINTERS FOR BASMAT(*)
  80. C IPR(2*MRELAS) WORK ARRAY FOR HARWELL SPARSE CODE
  81. C IWR(8*MRELAS) WORK ARRAY FOR HARWELL SPARSE CODE
  82. C WR(MRELAS) WORK ARRAY FOR HARWELL SPARSE CODE
  83. C RZ(NVARS+MRELAS) REDUCED COSTS
  84. C RPRIM(MRELAS) INTERNAL PRIMAL SOLUTION
  85. C RG(NVARS+MRELAS) COLUMN WEIGHTS
  86. C WW(MRELAS) WORK ARRAY
  87. C RHS(MRELAS) HOLDS TRANSLATED RIGHT HAND SIDE
  88. C
  89. C SCALAR LOCAL VARIABLES
  90. C NAME TYPE DESCRIPTION
  91. C
  92. C LMX INTEGER LENGTH OF AMAT(*)
  93. C LPG INTEGER LENGTH OF PAGE FOR AMAT(*)
  94. C EPS DOUBLE MACHINE PRECISION
  95. C TUNE DOUBLE PARAMETER TO SCALE ERROR ESTIMATES
  96. C TOLLS DOUBLE RELATIVE TOLERANCE FOR SMALL RESIDUALS
  97. C TOLABS DOUBLE ABSOLUTE TOLERANCE FOR SMALL RESIDUALS.
  98. C USED IF RELATIVE ERROR TEST FAILS.
  99. C IN CONSTRAINT EQUATIONS
  100. C FACTOR DOUBLE .01--DETERMINES IF BASIS IS SINGULAR
  101. C OR COMPONENT IS FEASIBLE. MAY NEED TO
  102. C BE INCREASED TO 1.D0 ON SHORT WORD
  103. C LENGTH MACHINES.
  104. C ASMALL DOUBLE LOWER BOUND FOR NON-ZERO MAGN. IN AMAT(*)
  105. C ABIG DOUBLE UPPER BOUND FOR NON-ZERO MAGN. IN AMAT(*)
  106. C MXITLP INTEGER MAXIMUM NUMBER OF ITERATIONS FOR LP
  107. C ITLP INTEGER ITERATION COUNTER FOR TOTAL LP ITERS
  108. C COSTSC DOUBLE COSTS(*) SCALING
  109. C SCOSTS DOUBLE TEMP LOC. FOR COSTSC.
  110. C XLAMDA DOUBLE WEIGHT PARAMETER FOR PEN. METHOD.
  111. C ANORM DOUBLE NORM OF DATA MATRIX AMAT(*)
  112. C RPRNRM DOUBLE NORM OF THE SOLUTION
  113. C DULNRM DOUBLE NORM OF THE DUALS
  114. C ERDNRM DOUBLE NORM OF ERROR IN DUAL VARIABLES
  115. C DIRNRM DOUBLE NORM OF THE DIRECTION VECTOR
  116. C RHSNRM DOUBLE NORM OF TRANSLATED RIGHT HAND SIDE VECTOR
  117. C RESNRM DOUBLE NORM OF RESIDUAL VECTOR FOR CHECKING
  118. C FEASIBILITY
  119. C NZBM INTEGER NUMBER OF NON-ZEROS IN BASMAT(*)
  120. C LBM INTEGER LENGTH OF BASMAT(*)
  121. C SMALL DOUBLE EPS*ANORM USED IN HARWELL SPARSE CODE
  122. C LP INTEGER USED IN HARWELL LA05*() PACK AS OUTPUT
  123. C FILE NUMBER. SET=I1MACH(4) NOW.
  124. C UU DOUBLE 0.1--USED IN HARWELL SPARSE CODE
  125. C FOR RELATIVE PIVOTING TOLERANCE.
  126. C GG DOUBLE OUTPUT INFO FLAG IN HARWELL SPARSE CODE
  127. C IPLACE INTEGER INTEGER USED BY SPARSE MATRIX CODES
  128. C IENTER INTEGER NEXT COLUMN TO ENTER BASIS
  129. C NREDC INTEGER NO. OF FULL REDECOMPOSITIONS
  130. C KPRINT INTEGER LEVEL OF OUTPUT, =0-3
  131. C IDG INTEGER FORMAT AND PRECISION OF OUTPUT
  132. C ITBRC INTEGER NO. OF ITERS. BETWEEN RECALCULATING
  133. C THE ERROR IN THE PRIMAL SOLUTION.
  134. C NPP INTEGER NO. OF NEGATIVE REDUCED COSTS REQUIRED
  135. C IN PARTIAL PRICING
  136. C JSTRT INTEGER STARTING PLACE FOR PARTIAL PRICING.
  137. C
  138. LOGICAL COLSCP,SAVEDT,CONTIN,CSTSCP,UNBND,
  139. * FEAS,FINITE,FOUND,MINPRB,REDBAS,
  140. * SINGLR,SIZEUP,STPEDG,TRANS,USRBAS,ZEROLV,LOPT(08)
  141. CHARACTER*8 XERN1, XERN2
  142. EQUIVALENCE (CONTIN,LOPT(1)),(USRBAS,LOPT(2)),
  143. * (SIZEUP,LOPT(3)),(SAVEDT,LOPT(4)),(COLSCP,LOPT(5)),
  144. * (CSTSCP,LOPT(6)),(MINPRB,LOPT(7)),(STPEDG,LOPT(8)),
  145. * (IDG,INTOPT(1)),(IPAGEF,INTOPT(2)),(ISAVE,INTOPT(3)),
  146. * (MXITLP,INTOPT(4)),(KPRINT,INTOPT(5)),(ITBRC,INTOPT(6)),
  147. * (NPP,INTOPT(7)),(LPRG,INTOPT(8)),(EPS,ROPT(1)),(ASMALL,ROPT(2)),
  148. * (ABIG,ROPT(3)),(COSTSC,ROPT(4)),(TOLLS,ROPT(5)),(TUNE,ROPT(6)),
  149. * (TOLABS,ROPT(7))
  150. C
  151. C COMMON BLOCK USED BY LA05 () PACKAGE..
  152. COMMON /LA05DD/ SMALL,LP,LENL,LENU,NCP,LROW,LCOL
  153. EXTERNAL DUSRMT
  154. C
  155. C SET LP=0 SO NO ERROR MESSAGES WILL PRINT WITHIN LA05 () PACKAGE.
  156. C***FIRST EXECUTABLE STATEMENT DPLPMN
  157. LP=0
  158. C
  159. C THE VALUES ZERO AND ONE.
  160. ZERO=0.D0
  161. ONE=1.D0
  162. FACTOR=0.01D0
  163. LPG=LMX-(NVARS+4)
  164. IOPT=1
  165. INFO=0
  166. UNBND=.FALSE.
  167. JSTRT=1
  168. C
  169. C PROCESS USER OPTIONS IN PRGOPT(*).
  170. C CHECK THAT ANY USER-GIVEN CHANGES ARE WELL-DEFINED.
  171. CALL DPOPT(PRGOPT,MRELAS,NVARS,INFO,CSC,IBASIS,ROPT,INTOPT,LOPT)
  172. IF (.NOT.(INFO.LT.0)) GO TO 20002
  173. GO TO 30001
  174. 20002 IF (.NOT.(CONTIN)) GO TO 20003
  175. GO TO 30002
  176. 20006 GO TO 20004
  177. C
  178. C INITIALIZE SPARSE DATA MATRIX, AMAT(*) AND IMAT(*).
  179. 20003 CALL DPINTM(MRELAS,NVARS,AMAT,IMAT,LMX,IPAGEF)
  180. C
  181. C UPDATE MATRIX DATA AND CHECK BOUNDS FOR CONSISTENCY.
  182. 20004 CALL DPLPUP(DUSRMT,MRELAS,NVARS,PRGOPT,DATTRV,
  183. * BL,BU,IND,INFO,AMAT,IMAT,SIZEUP,ASMALL,ABIG)
  184. IF (.NOT.(INFO.LT.0)) GO TO 20007
  185. GO TO 30001
  186. C
  187. C++ CODE FOR OUTPUT=YES IS ACTIVE
  188. 20007 IF (.NOT.(KPRINT.GE.1)) GO TO 20008
  189. GO TO 30003
  190. 20011 CONTINUE
  191. C++ CODE FOR OUTPUT=NO IS INACTIVE
  192. C++ END
  193. C
  194. C INITIALIZATION. SCALE DATA, NORMALIZE BOUNDS, FORM COLUMN
  195. C CHECK SUMS, AND FORM INITIAL BASIS MATRIX.
  196. 20008 CALL DPINIT(MRELAS,NVARS,COSTS,BL,BU,IND,PRIMAL,INFO,
  197. * AMAT,CSC,COSTSC,COLNRM,XLAMDA,ANORM,RHS,RHSNRM,
  198. * IBASIS,IBB,IMAT,LOPT)
  199. IF (.NOT.(INFO.LT.0)) GO TO 20012
  200. GO TO 30001
  201. C
  202. 20012 NREDC=0
  203. ASSIGN 20013 TO NPR004
  204. GO TO 30004
  205. 20013 IF (.NOT.(SINGLR)) GO TO 20014
  206. NERR=23
  207. CALL XERMSG ('SLATEC', 'DPLPMN',
  208. + 'IN DSPLP, A SINGULAR INITIAL BASIS WAS ENCOUNTERED.', NERR,
  209. + IOPT)
  210. INFO=-NERR
  211. GO TO 30001
  212. 20014 ASSIGN 20018 TO NPR005
  213. GO TO 30005
  214. 20018 ASSIGN 20019 TO NPR006
  215. GO TO 30006
  216. 20019 ASSIGN 20020 TO NPR007
  217. GO TO 30007
  218. 20020 IF (.NOT.(USRBAS)) GO TO 20021
  219. ASSIGN 20024 TO NPR008
  220. GO TO 30008
  221. 20024 IF (.NOT.(.NOT.FEAS)) GO TO 20025
  222. NERR=24
  223. CALL XERMSG ('SLATEC', 'DPLPMN',
  224. + 'IN DSPLP, AN INFEASIBLE INITIAL BASIS WAS ENCOUNTERED.',
  225. + NERR, IOPT)
  226. INFO=-NERR
  227. GO TO 30001
  228. 20025 CONTINUE
  229. 20021 ITLP=0
  230. C
  231. C LAMDA HAS BEEN SET TO A CONSTANT, PERFORM PENALTY METHOD.
  232. ASSIGN 20029 TO NPR009
  233. GO TO 30009
  234. 20029 ASSIGN 20030 TO NPR010
  235. GO TO 30010
  236. 20030 ASSIGN 20031 TO NPR006
  237. GO TO 30006
  238. 20031 ASSIGN 20032 TO NPR008
  239. GO TO 30008
  240. 20032 IF (.NOT.(.NOT.FEAS)) GO TO 20033
  241. C
  242. C SET LAMDA TO INFINITY BY SETTING COSTSC TO ZERO (SAVE THE VALUE OF
  243. C COSTSC) AND PERFORM STANDARD PHASE-1.
  244. IF(KPRINT.GE.2)CALL IVOUT(0,IDUM,'('' ENTER STANDARD PHASE-1'')',
  245. *IDG)
  246. SCOSTS=COSTSC
  247. COSTSC=ZERO
  248. ASSIGN 20036 TO NPR007
  249. GO TO 30007
  250. 20036 ASSIGN 20037 TO NPR009
  251. GO TO 30009
  252. 20037 ASSIGN 20038 TO NPR010
  253. GO TO 30010
  254. 20038 ASSIGN 20039 TO NPR006
  255. GO TO 30006
  256. 20039 ASSIGN 20040 TO NPR008
  257. GO TO 30008
  258. 20040 IF (.NOT.(FEAS)) GO TO 20041
  259. C
  260. C SET LAMDA TO ZERO, COSTSC=SCOSTS, PERFORM STANDARD PHASE-2.
  261. IF(KPRINT.GT.1)CALL IVOUT(0,IDUM,'('' ENTER STANDARD PHASE-2'')',
  262. *IDG)
  263. XLAMDA=ZERO
  264. COSTSC=SCOSTS
  265. ASSIGN 20044 TO NPR009
  266. GO TO 30009
  267. 20044 CONTINUE
  268. 20041 GO TO 20034
  269. C CHECK IF ANY BASIC VARIABLES ARE STILL CLASSIFIED AS
  270. C INFEASIBLE. IF ANY ARE, THEN THIS MAY NOT YET BE AN
  271. C OPTIMAL POINT. THEREFORE SET LAMDA TO ZERO AND TRY
  272. C TO PERFORM MORE SIMPLEX STEPS.
  273. 20033 I=1
  274. N20046=MRELAS
  275. GO TO 20047
  276. 20046 I=I+1
  277. 20047 IF ((N20046-I).LT.0) GO TO 20048
  278. IF (PRIMAL(I+NVARS).NE.ZERO) GO TO 20045
  279. GO TO 20046
  280. 20048 GO TO 20035
  281. 20045 XLAMDA=ZERO
  282. ASSIGN 20050 TO NPR009
  283. GO TO 30009
  284. 20050 CONTINUE
  285. 20034 CONTINUE
  286. C
  287. 20035 ASSIGN 20051 TO NPR011
  288. GO TO 30011
  289. 20051 IF (.NOT.(FEAS.AND.(.NOT.UNBND))) GO TO 20052
  290. INFO=1
  291. GO TO 20053
  292. 20052 IF (.NOT.((.NOT.FEAS).AND.(.NOT.UNBND))) GO TO 10001
  293. NERR=1
  294. CALL XERMSG ('SLATEC', 'DPLPMN',
  295. + 'IN DSPLP, THE PROBLEM APPEARS TO BE INFEASIBLE', NERR, IOPT)
  296. INFO=-NERR
  297. GO TO 20053
  298. 10001 IF (.NOT.(FEAS .AND. UNBND)) GO TO 10002
  299. NERR=2
  300. CALL XERMSG ('SLATEC', 'DPLPMN',
  301. + 'IN DSPLP, THE PROBLEM APPEARS TO HAVE NO FINITE SOLUTION.',
  302. + NERR, IOPT)
  303. INFO=-NERR
  304. GO TO 20053
  305. 10002 IF (.NOT.((.NOT.FEAS).AND.UNBND)) GO TO 10003
  306. NERR=3
  307. CALL XERMSG ('SLATEC', 'DPLPMN',
  308. + 'IN DSPLP, THE PROBLEM APPEARS TO BE INFEASIBLE AND TO ' //
  309. + 'HAVE NO FINITE SOLN.', NERR, IOPT)
  310. INFO=-NERR
  311. 10003 CONTINUE
  312. 20053 CONTINUE
  313. C
  314. IF (.NOT.(INFO.EQ.(-1) .OR. INFO.EQ.(-3))) GO TO 20055
  315. SIZE=DASUM(NVARS,PRIMAL,1)*ANORM
  316. SIZE=SIZE/DASUM(NVARS,CSC,1)
  317. SIZE=SIZE+DASUM(MRELAS,PRIMAL(NVARS+1),1)
  318. I=1
  319. N20058=NVARS+MRELAS
  320. GO TO 20059
  321. 20058 I=I+1
  322. 20059 IF ((N20058-I).LT.0) GO TO 20060
  323. NX0066=IND(I)
  324. IF (NX0066.LT.1.OR.NX0066.GT.4) GO TO 20066
  325. GO TO (20062,20063,20064,20065), NX0066
  326. 20062 IF (.NOT.(SIZE+ABS(PRIMAL(I)-BL(I))*FACTOR.EQ.SIZE)) GO TO 20068
  327. GO TO 20058
  328. 20068 IF (.NOT.(PRIMAL(I).GT.BL(I))) GO TO 10004
  329. GO TO 20058
  330. 10004 IND(I)=-4
  331. GO TO 20067
  332. 20063 IF (.NOT.(SIZE+ABS(PRIMAL(I)-BU(I))*FACTOR.EQ.SIZE)) GO TO 20071
  333. GO TO 20058
  334. 20071 IF (.NOT.(PRIMAL(I).LT.BU(I))) GO TO 10005
  335. GO TO 20058
  336. 10005 IND(I)=-4
  337. GO TO 20067
  338. 20064 IF (.NOT.(SIZE+ABS(PRIMAL(I)-BL(I))*FACTOR.EQ.SIZE)) GO TO 20074
  339. GO TO 20058
  340. 20074 IF (.NOT.(PRIMAL(I).LT.BL(I))) GO TO 10006
  341. IND(I)=-4
  342. GO TO 20075
  343. 10006 IF (.NOT.(SIZE+ABS(PRIMAL(I)-BU(I))*FACTOR.EQ.SIZE)) GO TO 10007
  344. GO TO 20058
  345. 10007 IF (.NOT.(PRIMAL(I).GT.BU(I))) GO TO 10008
  346. IND(I)=-4
  347. GO TO 20075
  348. 10008 GO TO 20058
  349. 20075 GO TO 20067
  350. 20065 GO TO 20058
  351. 20066 CONTINUE
  352. 20067 GO TO 20058
  353. 20060 CONTINUE
  354. 20055 CONTINUE
  355. C
  356. IF (.NOT.(INFO.EQ.(-2) .OR. INFO.EQ.(-3))) GO TO 20077
  357. J=1
  358. N20080=NVARS
  359. GO TO 20081
  360. 20080 J=J+1
  361. 20081 IF ((N20080-J).LT.0) GO TO 20082
  362. IF (.NOT.(IBB(J).EQ.0)) GO TO 20084
  363. NX0091=IND(J)
  364. IF (NX0091.LT.1.OR.NX0091.GT.4) GO TO 20091
  365. GO TO (20087,20088,20089,20090), NX0091
  366. 20087 BU(J)=BL(J)
  367. IND(J)=-3
  368. GO TO 20092
  369. 20088 BL(J)=BU(J)
  370. IND(J)=-3
  371. GO TO 20092
  372. 20089 GO TO 20080
  373. 20090 BL(J)=ZERO
  374. BU(J)=ZERO
  375. IND(J)=-3
  376. 20091 CONTINUE
  377. 20092 CONTINUE
  378. 20084 GO TO 20080
  379. 20082 CONTINUE
  380. 20077 CONTINUE
  381. C++ CODE FOR OUTPUT=YES IS ACTIVE
  382. IF (.NOT.(KPRINT.GE.1)) GO TO 20093
  383. ASSIGN 20096 TO NPR012
  384. GO TO 30012
  385. 20096 CONTINUE
  386. 20093 CONTINUE
  387. C++ CODE FOR OUTPUT=NO IS INACTIVE
  388. C++ END
  389. GO TO 30001
  390. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  391. C PROCEDURE (COMPUTE RIGHT HAND SIDE)
  392. 30010 RHS(1)=ZERO
  393. CALL DCOPY(MRELAS,RHS,0,RHS,1)
  394. J=1
  395. N20098=NVARS+MRELAS
  396. GO TO 20099
  397. 20098 J=J+1
  398. 20099 IF ((N20098-J).LT.0) GO TO 20100
  399. NX0106=IND(J)
  400. IF (NX0106.LT.1.OR.NX0106.GT.4) GO TO 20106
  401. GO TO (20102,20103,20104,20105), NX0106
  402. 20102 SCALR=-BL(J)
  403. GO TO 20107
  404. 20103 SCALR=-BU(J)
  405. GO TO 20107
  406. 20104 SCALR=-BL(J)
  407. GO TO 20107
  408. 20105 SCALR=ZERO
  409. 20106 CONTINUE
  410. 20107 IF (.NOT.(SCALR.NE.ZERO)) GO TO 20108
  411. IF (.NOT.(J.LE.NVARS)) GO TO 20111
  412. I=0
  413. 20114 CALL DPNNZR(I,AIJ,IPLACE,AMAT,IMAT,J)
  414. IF (.NOT.(I.LE.0)) GO TO 20116
  415. GO TO 20115
  416. 20116 RHS(I)=RHS(I)+AIJ*SCALR
  417. GO TO 20114
  418. 20115 GO TO 20112
  419. 20111 RHS(J-NVARS)=RHS(J-NVARS)-SCALR
  420. 20112 CONTINUE
  421. 20108 GO TO 20098
  422. 20100 J=1
  423. N20119=NVARS+MRELAS
  424. GO TO 20120
  425. 20119 J=J+1
  426. 20120 IF ((N20119-J).LT.0) GO TO 20121
  427. SCALR=ZERO
  428. IF(IND(J).EQ.3.AND.MOD(IBB(J),2).EQ.0) SCALR=BU(J)-BL(J)
  429. IF (.NOT.(SCALR.NE.ZERO)) GO TO 20123
  430. IF (.NOT.(J.LE.NVARS)) GO TO 20126
  431. I=0
  432. 20129 CALL DPNNZR(I,AIJ,IPLACE,AMAT,IMAT,J)
  433. IF (.NOT.(I.LE.0)) GO TO 20131
  434. GO TO 20130
  435. 20131 RHS(I)=RHS(I)-AIJ*SCALR
  436. GO TO 20129
  437. 20130 GO TO 20127
  438. 20126 RHS(J-NVARS)=RHS(J-NVARS)+SCALR
  439. 20127 CONTINUE
  440. 20123 GO TO 20119
  441. 20121 CONTINUE
  442. GO TO NPR010, (20030,20038)
  443. C PROCEDURE (PERFORM SIMPLEX STEPS)
  444. 30009 ASSIGN 20134 TO NPR013
  445. GO TO 30013
  446. 20134 ASSIGN 20135 TO NPR014
  447. GO TO 30014
  448. 20135 IF (.NOT.(KPRINT.GT.2)) GO TO 20136
  449. CALL DVOUT(MRELAS,DUALS,'('' BASIC (INTERNAL) DUAL SOLN.'')',IDG)
  450. CALL DVOUT(NVARS+MRELAS,RZ,'('' REDUCED COSTS'')',IDG)
  451. 20136 CONTINUE
  452. 20139 ASSIGN 20141 TO NPR015
  453. GO TO 30015
  454. 20141 IF (.NOT.(.NOT. FOUND)) GO TO 20142
  455. GO TO 30016
  456. 20145 CONTINUE
  457. 20142 IF (.NOT.(FOUND)) GO TO 20146
  458. IF (KPRINT.GE.3) CALL DVOUT(MRELAS,WW,'('' SEARCH DIRECTION'')',
  459. *IDG)
  460. GO TO 30017
  461. 20149 IF (.NOT.(FINITE)) GO TO 20150
  462. GO TO 30018
  463. 20153 ASSIGN 20154 TO NPR005
  464. GO TO 30005
  465. 20154 GO TO 20151
  466. 20150 UNBND=.TRUE.
  467. IBB(IBASIS(IENTER))=0
  468. 20151 GO TO 20147
  469. 20146 GO TO 20140
  470. 20147 ITLP=ITLP+1
  471. GO TO 30019
  472. 20155 GO TO 20139
  473. 20140 CONTINUE
  474. GO TO NPR009, (20029,20037,20044,20050)
  475. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  476. C PROCEDURE (RETRIEVE SAVED DATA FROM FILE ISAVE)
  477. 30002 LPR=NVARS+4
  478. REWIND ISAVE
  479. READ(ISAVE) (AMAT(I),I=1,LPR),(IMAT(I),I=1,LPR)
  480. KEY=2
  481. IPAGE=1
  482. GO TO 20157
  483. 20156 IF (NP.LT.0) GO TO 20158
  484. 20157 LPR1=LPR+1
  485. READ(ISAVE) (AMAT(I),I=LPR1,LMX),(IMAT(I),I=LPR1,LMX)
  486. CALL DPRWPG(KEY,IPAGE,LPG,AMAT,IMAT)
  487. NP=IMAT(LMX-1)
  488. IPAGE=IPAGE+1
  489. GO TO 20156
  490. 20158 NPARM=NVARS+MRELAS
  491. READ(ISAVE) (IBASIS(I),I=1,NPARM)
  492. REWIND ISAVE
  493. GO TO 20006
  494. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  495. C PROCEDURE (SAVE DATA ON FILE ISAVE)
  496. C
  497. C SOME PAGES MAY NOT BE WRITTEN YET.
  498. 30020 IF (.NOT.(AMAT(LMX).EQ.ONE)) GO TO 20159
  499. AMAT(LMX)=ZERO
  500. KEY=2
  501. IPAGE=ABS(IMAT(LMX-1))
  502. CALL DPRWPG(KEY,IPAGE,LPG,AMAT,IMAT)
  503. C
  504. C FORCE PAGE FILE TO BE OPENED ON RESTARTS.
  505. 20159 KEY=AMAT(4)
  506. AMAT(4)=ZERO
  507. LPR=NVARS+4
  508. WRITE(ISAVE) (AMAT(I),I=1,LPR),(IMAT(I),I=1,LPR)
  509. AMAT(4)=KEY
  510. IPAGE=1
  511. KEY=1
  512. GO TO 20163
  513. 20162 IF (NP.LT.0) GO TO 20164
  514. 20163 CALL DPRWPG(KEY,IPAGE,LPG,AMAT,IMAT)
  515. LPR1=LPR+1
  516. WRITE(ISAVE) (AMAT(I),I=LPR1,LMX),(IMAT(I),I=LPR1,LMX)
  517. NP=IMAT(LMX-1)
  518. IPAGE=IPAGE+1
  519. GO TO 20162
  520. 20164 NPARM=NVARS+MRELAS
  521. WRITE(ISAVE) (IBASIS(I),I=1,NPARM)
  522. ENDFILE ISAVE
  523. C
  524. C CLOSE FILE, IPAGEF, WHERE PAGES ARE STORED. THIS IS NEEDED SO THAT
  525. C THE PAGES MAY BE RESTORED AT A CONTINUATION OF DSPLP().
  526. GO TO 20317
  527. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  528. C PROCEDURE (DECOMPOSE BASIS MATRIX)
  529. C++ CODE FOR OUTPUT=YES IS ACTIVE
  530. 30004 IF (.NOT.(KPRINT.GE.2)) GO TO 20165
  531. CALL IVOUT(MRELAS,IBASIS,
  532. *'('' SUBSCRIPTS OF BASIC VARIABLES DURING REDECOMPOSITION'')',
  533. *IDG)
  534. C++ CODE FOR OUTPUT=NO IS INACTIVE
  535. C++ END
  536. C
  537. C SET RELATIVE PIVOTING FACTOR FOR USE IN LA05 () PACKAGE.
  538. 20165 UU=0.1
  539. CALL DPLPDM(
  540. *MRELAS,NVARS,LMX,LBM,NREDC,INFO,IOPT,
  541. *IBASIS,IMAT,IBRC,IPR,IWR,IND,IBB,
  542. *ANORM,EPS,UU,GG,
  543. *AMAT,BASMAT,CSC,WR,
  544. *SINGLR,REDBAS)
  545. IF (.NOT.(INFO.LT.0)) GO TO 20168
  546. GO TO 30001
  547. 20168 CONTINUE
  548. GO TO NPR004, (20013,20204,20242)
  549. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  550. C PROCEDURE (CLASSIFY VARIABLES)
  551. C
  552. C DEFINE THE CLASSIFICATION OF THE BASIC VARIABLES
  553. C -1 VIOLATES LOWER BOUND, 0 FEASIBLE, +1 VIOLATES UPPER BOUND.
  554. C (THIS INFO IS STORED IN PRIMAL(NVARS+1)-PRIMAL(NVARS+MRELAS))
  555. C TRANSLATE VARIABLE TO ITS UPPER BOUND, IF .GT. UPPER BOUND
  556. 30007 PRIMAL(NVARS+1)=ZERO
  557. CALL DCOPY(MRELAS,PRIMAL(NVARS+1),0,PRIMAL(NVARS+1),1)
  558. I=1
  559. N20172=MRELAS
  560. GO TO 20173
  561. 20172 I=I+1
  562. 20173 IF ((N20172-I).LT.0) GO TO 20174
  563. J=IBASIS(I)
  564. IF (.NOT.(IND(J).NE.4)) GO TO 20176
  565. IF (.NOT.(RPRIM(I).LT.ZERO)) GO TO 20179
  566. PRIMAL(I+NVARS)=-ONE
  567. GO TO 20180
  568. 20179 IF (.NOT.(IND(J).EQ.3)) GO TO 10009
  569. UPBND=BU(J)-BL(J)
  570. IF (J.LE.NVARS) UPBND=UPBND/CSC(J)
  571. IF (.NOT.(RPRIM(I).GT.UPBND)) GO TO 20182
  572. RPRIM(I)=RPRIM(I)-UPBND
  573. IF (.NOT.(J.LE.NVARS)) GO TO 20185
  574. K=0
  575. 20188 CALL DPNNZR(K,AIJ,IPLACE,AMAT,IMAT,J)
  576. IF (.NOT.(K.LE.0)) GO TO 20190
  577. GO TO 20189
  578. 20190 RHS(K)=RHS(K)-UPBND*AIJ*CSC(J)
  579. GO TO 20188
  580. 20189 GO TO 20186
  581. 20185 RHS(J-NVARS)=RHS(J-NVARS)+UPBND
  582. 20186 PRIMAL(I+NVARS)=ONE
  583. 20182 CONTINUE
  584. CONTINUE
  585. 10009 CONTINUE
  586. 20180 CONTINUE
  587. 20176 GO TO 20172
  588. 20174 CONTINUE
  589. GO TO NPR007, (20020,20036)
  590. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  591. C PROCEDURE (COMPUTE ERROR IN DUAL AND PRIMAL SYSTEMS)
  592. 30005 NTRIES=1
  593. GO TO 20195
  594. 20194 NTRIES=NTRIES+1
  595. 20195 IF ((2-NTRIES).LT.0) GO TO 20196
  596. CALL DPLPCE(
  597. *MRELAS,NVARS,LMX,LBM,ITLP,ITBRC,
  598. *IBASIS,IMAT,IBRC,IPR,IWR,IND,IBB,
  599. *ERDNRM,EPS,TUNE,GG,
  600. *AMAT,BASMAT,CSC,WR,WW,PRIMAL,ERD,ERP,
  601. *SINGLR,REDBAS)
  602. IF (.NOT.(.NOT. SINGLR)) GO TO 20198
  603. C++ CODE FOR OUTPUT=YES IS ACTIVE
  604. IF (.NOT.(KPRINT.GE.3)) GO TO 20201
  605. CALL DVOUT(MRELAS,ERP,'('' EST. ERROR IN PRIMAL COMPS.'')',IDG)
  606. CALL DVOUT(MRELAS,ERD,'('' EST. ERROR IN DUAL COMPS.'')',IDG)
  607. 20201 CONTINUE
  608. C++ CODE FOR OUTPUT=NO IS INACTIVE
  609. C++ END
  610. GO TO 20193
  611. 20198 IF (NTRIES.EQ.2) GO TO 20197
  612. ASSIGN 20204 TO NPR004
  613. GO TO 30004
  614. 20204 CONTINUE
  615. GO TO 20194
  616. 20196 CONTINUE
  617. 20197 NERR=26
  618. CALL XERMSG ('SLATEC', 'DPLPMN',
  619. + 'IN DSPLP, MOVED TO A SINGULAR POINT. THIS SHOULD NOT HAPPEN.',
  620. + NERR, IOPT)
  621. INFO=-NERR
  622. GO TO 30001
  623. 20193 CONTINUE
  624. GO TO NPR005, (20018,20154,20243)
  625. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  626. C PROCEDURE (CHECK FEASIBILITY)
  627. C
  628. C SEE IF NEARBY FEASIBLE POINT SATISFIES THE CONSTRAINT
  629. C EQUATIONS.
  630. C
  631. C COPY RHS INTO WW(*), THEN UPDATE WW(*).
  632. 30008 CALL DCOPY(MRELAS,RHS,1,WW,1)
  633. J=1
  634. N20206=MRELAS
  635. GO TO 20207
  636. 20206 J=J+1
  637. 20207 IF ((N20206-J).LT.0) GO TO 20208
  638. IBAS=IBASIS(J)
  639. XVAL=RPRIM(J)
  640. C
  641. C ALL VARIABLES BOUNDED BELOW HAVE ZERO AS THAT BOUND.
  642. IF (IND(IBAS).LE.3) XVAL=MAX(ZERO,XVAL)
  643. C
  644. C IF THE VARIABLE HAS AN UPPER BOUND, COMPUTE THAT BOUND.
  645. IF (.NOT.(IND(IBAS).EQ.3)) GO TO 20210
  646. UPBND=BU(IBAS)-BL(IBAS)
  647. IF (IBAS.LE.NVARS) UPBND=UPBND/CSC(IBAS)
  648. XVAL=MIN(UPBND,XVAL)
  649. 20210 CONTINUE
  650. C
  651. C SUBTRACT XVAL TIMES COLUMN VECTOR FROM RIGHT-HAND SIDE IN WW(*)
  652. IF (.NOT.(XVAL.NE.ZERO)) GO TO 20213
  653. IF (.NOT.(IBAS.LE.NVARS)) GO TO 20216
  654. I=0
  655. 20219 CALL DPNNZR(I,AIJ,IPLACE,AMAT,IMAT,IBAS)
  656. IF (.NOT.(I.LE.0)) GO TO 20221
  657. GO TO 20220
  658. 20221 WW(I)=WW(I)-XVAL*AIJ*CSC(IBAS)
  659. GO TO 20219
  660. 20220 GO TO 20217
  661. 20216 IF (.NOT.(IND(IBAS).EQ.2)) GO TO 20224
  662. WW(IBAS-NVARS)=WW(IBAS-NVARS)-XVAL
  663. GO TO 20225
  664. 20224 WW(IBAS-NVARS)=WW(IBAS-NVARS)+XVAL
  665. 20225 CONTINUE
  666. CONTINUE
  667. 20217 CONTINUE
  668. 20213 CONTINUE
  669. GO TO 20206
  670. C
  671. C COMPUTE NORM OF DIFFERENCE AND CHECK FOR FEASIBILITY.
  672. 20208 RESNRM=DASUM(MRELAS,WW,1)
  673. FEAS=RESNRM.LE.TOLLS*(RPRNRM*ANORM+RHSNRM)
  674. C
  675. C TRY AN ABSOLUTE ERROR TEST IF THE RELATIVE TEST FAILS.
  676. IF(.NOT. FEAS)FEAS=RESNRM.LE.TOLABS
  677. IF (.NOT.(FEAS)) GO TO 20227
  678. PRIMAL(NVARS+1)=ZERO
  679. CALL DCOPY(MRELAS,PRIMAL(NVARS+1),0,PRIMAL(NVARS+1),1)
  680. 20227 CONTINUE
  681. GO TO NPR008, (20024,20032,20040)
  682. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  683. C PROCEDURE (INITIALIZE REDUCED COSTS AND STEEPEST EDGE WEIGHTS)
  684. 30014 CALL DPINCW(
  685. *MRELAS,NVARS,LMX,LBM,NPP,JSTRT,
  686. *IBASIS,IMAT,IBRC,IPR,IWR,IND,IBB,
  687. *COSTSC,GG,ERDNRM,DULNRM,
  688. *AMAT,BASMAT,CSC,WR,WW,RZ,RG,COSTS,COLNRM,DUALS,
  689. *STPEDG)
  690. C
  691. GO TO NPR014, (20135,20246)
  692. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  693. C PROCEDURE (CHECK AND RETURN WITH EXCESS ITERATIONS)
  694. 30019 IF (.NOT.(ITLP.GT.MXITLP)) GO TO 20230
  695. NERR=25
  696. ASSIGN 20233 TO NPR011
  697. GO TO 30011
  698. C++ CODE FOR OUTPUT=YES IS ACTIVE
  699. 20233 IF (.NOT.(KPRINT.GE.1)) GO TO 20234
  700. ASSIGN 20237 TO NPR012
  701. GO TO 30012
  702. 20237 CONTINUE
  703. 20234 CONTINUE
  704. C++ CODE FOR OUTPUT=NO IS INACTIVE
  705. C++ END
  706. IDUM(1)=0
  707. IF(SAVEDT) IDUM(1)=ISAVE
  708. WRITE (XERN1, '(I8)') MXITLP
  709. WRITE (XERN2, '(I8)') IDUM(1)
  710. CALL XERMSG ('SLATEC', 'DPLPMN',
  711. * 'IN DSPLP, MAX ITERATIONS = ' // XERN1 //
  712. * ' TAKEN. UP-TO-DATE RESULTS SAVED ON FILE NO. ' // XERN2 //
  713. * '. IF FILE NO. = 0, NO SAVE.', NERR, IOPT)
  714. INFO=-NERR
  715. GO TO 30001
  716. 20230 CONTINUE
  717. GO TO 20155
  718. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  719. C PROCEDURE (REDECOMPOSE BASIS MATRIX AND TRY AGAIN)
  720. 30016 IF (.NOT.(.NOT.REDBAS)) GO TO 20239
  721. ASSIGN 20242 TO NPR004
  722. GO TO 30004
  723. 20242 ASSIGN 20243 TO NPR005
  724. GO TO 30005
  725. 20243 ASSIGN 20244 TO NPR006
  726. GO TO 30006
  727. 20244 ASSIGN 20245 TO NPR013
  728. GO TO 30013
  729. 20245 ASSIGN 20246 TO NPR014
  730. GO TO 30014
  731. 20246 CONTINUE
  732. C
  733. C ERASE NON-CYCLING MARKERS NEAR COMPLETION.
  734. 20239 I=MRELAS+1
  735. N20247=MRELAS+NVARS
  736. GO TO 20248
  737. 20247 I=I+1
  738. 20248 IF ((N20247-I).LT.0) GO TO 20249
  739. IBASIS(I)=ABS(IBASIS(I))
  740. GO TO 20247
  741. 20249 ASSIGN 20251 TO NPR015
  742. GO TO 30015
  743. 20251 CONTINUE
  744. GO TO 20145
  745. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  746. C PROCEDURE (COMPUTE NEW PRIMAL)
  747. C
  748. C COPY RHS INTO WW(*), SOLVE SYSTEM.
  749. 30006 CALL DCOPY(MRELAS,RHS,1,WW,1)
  750. TRANS = .FALSE.
  751. CALL LA05BD(BASMAT,IBRC,LBM,MRELAS,IPR,IWR,WR,GG,WW,TRANS)
  752. CALL DCOPY(MRELAS,WW,1,RPRIM,1)
  753. RPRNRM=DASUM(MRELAS,RPRIM,1)
  754. GO TO NPR006, (20019,20031,20039,20244,20275)
  755. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  756. C PROCEDURE (COMPUTE NEW DUALS)
  757. C
  758. C SOLVE FOR DUAL VARIABLES. FIRST COPY COSTS INTO DUALS(*).
  759. 30013 I=1
  760. N20252=MRELAS
  761. GO TO 20253
  762. 20252 I=I+1
  763. 20253 IF ((N20252-I).LT.0) GO TO 20254
  764. J=IBASIS(I)
  765. IF (.NOT.(J.LE.NVARS)) GO TO 20256
  766. DUALS(I)=COSTSC*COSTS(J)*CSC(J) + XLAMDA*PRIMAL(I+NVARS)
  767. GO TO 20257
  768. 20256 DUALS(I)=XLAMDA*PRIMAL(I+NVARS)
  769. 20257 CONTINUE
  770. GO TO 20252
  771. C
  772. 20254 TRANS=.TRUE.
  773. CALL LA05BD(BASMAT,IBRC,LBM,MRELAS,IPR,IWR,WR,GG,DUALS,TRANS)
  774. DULNRM=DASUM(MRELAS,DUALS,1)
  775. GO TO NPR013, (20134,20245,20267)
  776. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  777. C PROCEDURE (FIND VARIABLE TO ENTER BASIS AND GET SEARCH DIRECTION)
  778. 30015 CALL DPLPFE(
  779. *MRELAS,NVARS,LMX,LBM,IENTER,
  780. *IBASIS,IMAT,IBRC,IPR,IWR,IND,IBB,
  781. *ERDNRM,EPS,GG,DULNRM,DIRNRM,
  782. *AMAT,BASMAT,CSC,WR,WW,BL,BU,RZ,RG,COLNRM,DUALS,
  783. *FOUND)
  784. GO TO NPR015, (20141,20251)
  785. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  786. C PROCEDURE (CHOOSE VARIABLE TO LEAVE BASIS)
  787. 30017 CALL DPLPFL(
  788. *MRELAS,NVARS,IENTER,ILEAVE,
  789. *IBASIS,IND,IBB,
  790. *THETA,DIRNRM,RPRNRM,
  791. *CSC,WW,BL,BU,ERP,RPRIM,PRIMAL,
  792. *FINITE,ZEROLV)
  793. GO TO 20149
  794. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  795. C PROCEDURE (MAKE MOVE AND UPDATE)
  796. 30018 CALL DPLPMU(
  797. *MRELAS,NVARS,LMX,LBM,NREDC,INFO,IENTER,ILEAVE,IOPT,NPP,JSTRT,
  798. *IBASIS,IMAT,IBRC,IPR,IWR,IND,IBB,
  799. *ANORM,EPS,UU,GG,RPRNRM,ERDNRM,DULNRM,THETA,COSTSC,XLAMDA,RHSNRM,
  800. *AMAT,BASMAT,CSC,WR,RPRIM,WW,BU,BL,RHS,ERD,ERP,RZ,RG,COLNRM,COSTS,
  801. *PRIMAL,DUALS,SINGLR,REDBAS,ZEROLV,STPEDG)
  802. IF (.NOT.(INFO.EQ.(-26))) GO TO 20259
  803. GO TO 30001
  804. C++ CODE FOR OUTPUT=YES IS ACTIVE
  805. 20259 IF (.NOT.(KPRINT.GE.2)) GO TO 20263
  806. GO TO 30021
  807. 20266 CONTINUE
  808. C++ CODE FOR OUTPUT=NO IS INACTIVE
  809. C++ END
  810. 20263 CONTINUE
  811. GO TO 20153
  812. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  813. C PROCEDURE(RESCALE AND REARRANGE VARIABLES)
  814. C
  815. C RESCALE THE DUAL VARIABLES.
  816. 30011 ASSIGN 20267 TO NPR013
  817. GO TO 30013
  818. 20267 IF (.NOT.(COSTSC.NE.ZERO)) GO TO 20268
  819. I=1
  820. N20271=MRELAS
  821. GO TO 20272
  822. 20271 I=I+1
  823. 20272 IF ((N20271-I).LT.0) GO TO 20273
  824. DUALS(I)=DUALS(I)/COSTSC
  825. GO TO 20271
  826. 20273 CONTINUE
  827. 20268 ASSIGN 20275 TO NPR006
  828. GO TO 30006
  829. C
  830. C REAPPLY COLUMN SCALING TO PRIMAL.
  831. 20275 I=1
  832. N20276=MRELAS
  833. GO TO 20277
  834. 20276 I=I+1
  835. 20277 IF ((N20276-I).LT.0) GO TO 20278
  836. J=IBASIS(I)
  837. IF (.NOT.(J.LE.NVARS)) GO TO 20280
  838. SCALR=CSC(J)
  839. IF(IND(J).EQ.2)SCALR=-SCALR
  840. RPRIM(I)=RPRIM(I)*SCALR
  841. 20280 GO TO 20276
  842. C
  843. C REPLACE TRANSLATED BASIC VARIABLES INTO ARRAY PRIMAL(*)
  844. 20278 PRIMAL(1)=ZERO
  845. CALL DCOPY(NVARS+MRELAS,PRIMAL,0,PRIMAL,1)
  846. J=1
  847. N20283=NVARS+MRELAS
  848. GO TO 20284
  849. 20283 J=J+1
  850. 20284 IF ((N20283-J).LT.0) GO TO 20285
  851. IBAS=ABS(IBASIS(J))
  852. XVAL=ZERO
  853. IF (J.LE.MRELAS) XVAL=RPRIM(J)
  854. IF (IND(IBAS).EQ.1) XVAL=XVAL+BL(IBAS)
  855. IF (IND(IBAS).EQ.2) XVAL=BU(IBAS)-XVAL
  856. IF (.NOT.(IND(IBAS).EQ.3)) GO TO 20287
  857. IF (MOD(IBB(IBAS),2).EQ.0) XVAL=BU(IBAS)-BL(IBAS)-XVAL
  858. XVAL = XVAL+BL(IBAS)
  859. 20287 PRIMAL(IBAS)=XVAL
  860. GO TO 20283
  861. C
  862. C COMPUTE DUALS FOR INDEPENDENT VARIABLES WITH BOUNDS.
  863. C OTHER ENTRIES ARE ZERO.
  864. 20285 J=1
  865. N20290=NVARS
  866. GO TO 20291
  867. 20290 J=J+1
  868. 20291 IF ((N20290-J).LT.0) GO TO 20292
  869. RZJ=ZERO
  870. IF (.NOT.(IBB(J).GT.ZERO .AND. IND(J).NE.4)) GO TO 20294
  871. RZJ=COSTS(J)
  872. I=0
  873. 20297 CALL DPNNZR(I,AIJ,IPLACE,AMAT,IMAT,J)
  874. IF (.NOT.(I.LE.0)) GO TO 20299
  875. GO TO 20298
  876. 20299 CONTINUE
  877. RZJ=RZJ-AIJ*DUALS(I)
  878. GO TO 20297
  879. 20298 CONTINUE
  880. 20294 DUALS(MRELAS+J)=RZJ
  881. GO TO 20290
  882. 20292 CONTINUE
  883. GO TO NPR011, (20051,20233)
  884. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  885. C++ CODE FOR OUTPUT=YES IS ACTIVE
  886. C PROCEDURE (PRINT PROLOGUE)
  887. 30003 IDUM(1)=MRELAS
  888. CALL IVOUT(1,IDUM,'(''1NUM. OF DEPENDENT VARS., MRELAS'')',IDG)
  889. IDUM(1)=NVARS
  890. CALL IVOUT(1,IDUM,'('' NUM. OF INDEPENDENT VARS., NVARS'')',IDG)
  891. CALL IVOUT(1,IDUM,'('' DIMENSION OF COSTS(*)='')',IDG)
  892. IDUM(1)=NVARS+MRELAS
  893. CALL IVOUT(1,IDUM, '('' DIMENSIONS OF BL(*),BU(*),IND(*)''
  894. */'' PRIMAL(*),DUALS(*) ='')',IDG)
  895. CALL IVOUT(1,IDUM,'('' DIMENSION OF IBASIS(*)='')',IDG)
  896. IDUM(1)=LPRG+1
  897. CALL IVOUT(1,IDUM,'('' DIMENSION OF PRGOPT(*)='')',IDG)
  898. CALL IVOUT(0,IDUM,
  899. * '('' 1-NVARS=INDEPENDENT VARIABLE INDICES.''/
  900. * '' (NVARS+1)-(NVARS+MRELAS)=DEPENDENT VARIABLE INDICES.''/
  901. * '' CONSTRAINT INDICATORS ARE 1-4 AND MEAN'')',IDG)
  902. CALL IVOUT(0,IDUM,
  903. * '('' 1=VARIABLE HAS ONLY LOWER BOUND.''/
  904. * '' 2=VARIABLE HAS ONLY UPPER BOUND.''/
  905. * '' 3=VARIABLE HAS BOTH BOUNDS.''/
  906. * '' 4=VARIABLE HAS NO BOUNDS, IT IS FREE.'')',IDG)
  907. CALL DVOUT(NVARS,COSTS,'('' ARRAY OF COSTS'')',IDG)
  908. CALL IVOUT(NVARS+MRELAS,IND,
  909. * '('' CONSTRAINT INDICATORS'')',IDG)
  910. CALL DVOUT(NVARS+MRELAS,BL,
  911. *'('' LOWER BOUNDS FOR VARIABLES (IGNORE UNUSED ENTRIES.)'')',IDG)
  912. CALL DVOUT(NVARS+MRELAS,BU,
  913. *'('' UPPER BOUNDS FOR VARIABLES (IGNORE UNUSED ENTRIES.)'')',IDG)
  914. IF (.NOT.(KPRINT.GE.2)) GO TO 20302
  915. CALL IVOUT(0,IDUM,
  916. * '(''0NON-BASIC INDICES THAT ARE NEGATIVE SHOW VARIABLES''
  917. * '' EXCHANGED AT A ZERO''/'' STEP LENGTH'')',IDG)
  918. CALL IVOUT(0,IDUM,
  919. * '('' WHEN COL. NO. LEAVING=COL. NO. ENTERING, THE ENTERING ''
  920. * ''VARIABLE MOVED''/'' TO ITS BOUND. IT REMAINS NON-BASIC.''/
  921. * '' WHEN COL. NO. OF BASIS EXCHANGED IS NEGATIVE, THE LEAVING''/
  922. * '' VARIABLE IS AT ITS UPPER BOUND.'')',IDG)
  923. 20302 CONTINUE
  924. GO TO 20011
  925. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  926. C PROCEDURE (PRINT SUMMARY)
  927. 30012 IDUM(1)=INFO
  928. CALL IVOUT(1,IDUM,'('' THE OUTPUT VALUE OF INFO IS'')',IDG)
  929. IF (.NOT.(MINPRB)) GO TO 20305
  930. CALL IVOUT(0,IDUM,'('' THIS IS A MINIMIZATION PROBLEM.'')',IDG)
  931. GO TO 20306
  932. 20305 CALL IVOUT(0,IDUM,'('' THIS IS A MAXIMIZATION PROBLEM.'')',IDG)
  933. 20306 IF (.NOT.(STPEDG)) GO TO 20308
  934. CALL IVOUT(0,IDUM,'('' STEEPEST EDGE PRICING WAS USED.'')',IDG)
  935. GO TO 20309
  936. 20308 CALL IVOUT(0,IDUM,'('' MINIMUM REDUCED COST PRICING WAS USED.'')',
  937. * IDG)
  938. 20309 RDUM(1)=DDOT(NVARS,COSTS,1,PRIMAL,1)
  939. CALL DVOUT(1,RDUM,
  940. * '('' OUTPUT VALUE OF THE OBJECTIVE FUNCTION'')',IDG)
  941. CALL DVOUT(NVARS+MRELAS,PRIMAL,
  942. * '('' THE OUTPUT INDEPENDENT AND DEPENDENT VARIABLES'')',IDG)
  943. CALL DVOUT(MRELAS+NVARS,DUALS,
  944. * '('' THE OUTPUT DUAL VARIABLES'')',IDG)
  945. CALL IVOUT(NVARS+MRELAS,IBASIS,
  946. * '('' VARIABLE INDICES IN POSITIONS 1-MRELAS ARE BASIC.'')',IDG)
  947. IDUM(1)=ITLP
  948. CALL IVOUT(1,IDUM,'('' NO. OF ITERATIONS'')',IDG)
  949. IDUM(1)=NREDC
  950. CALL IVOUT(1,IDUM,'('' NO. OF FULL REDECOMPS'')',IDG)
  951. GO TO NPR012, (20096,20237)
  952. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  953. C PROCEDURE (PRINT ITERATION SUMMARY)
  954. 30021 IDUM(1)=ITLP+1
  955. CALL IVOUT(1,IDUM,'(''0ITERATION NUMBER'')',IDG)
  956. IDUM(1)=IBASIS(ABS(ILEAVE))
  957. CALL IVOUT(1,IDUM,
  958. * '('' INDEX OF VARIABLE ENTERING THE BASIS'')',IDG)
  959. IDUM(1)=ILEAVE
  960. CALL IVOUT(1,IDUM,'('' COLUMN OF THE BASIS EXCHANGED'')',IDG)
  961. IDUM(1)=IBASIS(IENTER)
  962. CALL IVOUT(1,IDUM,
  963. * '('' INDEX OF VARIABLE LEAVING THE BASIS'')',IDG)
  964. RDUM(1)=THETA
  965. CALL DVOUT(1,RDUM,'('' LENGTH OF THE EXCHANGE STEP'')',IDG)
  966. IF (.NOT.(KPRINT.GE.3)) GO TO 20311
  967. CALL DVOUT(MRELAS,RPRIM,'('' BASIC (INTERNAL) PRIMAL SOLN.'')',
  968. * IDG)
  969. CALL IVOUT(NVARS+MRELAS,IBASIS,
  970. * '('' VARIABLE INDICES IN POSITIONS 1-MRELAS ARE BASIC.'')',IDG)
  971. CALL IVOUT(NVARS+MRELAS,IBB,'('' IBB ARRAY'')',IDG)
  972. CALL DVOUT(MRELAS,RHS,'('' TRANSLATED RHS'')',IDG)
  973. CALL DVOUT(MRELAS,DUALS,'('' BASIC (INTERNAL) DUAL SOLN.'')',IDG)
  974. 20311 CONTINUE
  975. GO TO 20266
  976. C++ CODE FOR OUTPUT=NO IS INACTIVE
  977. C++ END
  978. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  979. C PROCEDURE (RETURN TO USER)
  980. 30001 IF (.NOT.(SAVEDT)) GO TO 20314
  981. GO TO 30020
  982. 20317 CONTINUE
  983. 20314 IF(IMAT(LMX-1).NE.(-1)) CALL SCLOSM(IPAGEF)
  984. C
  985. C THIS TEST IS THERE ONLY TO AVOID DIAGNOSTICS ON SOME FORTRAN
  986. C COMPILERS.
  987. RETURN
  988. END