splpmn.f 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988
  1. *DECK SPLPMN
  2. SUBROUTINE SPLPMN (USRMAT, 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 SPLPMN
  7. C***SUBSIDIARY
  8. C***PURPOSE Subsidiary to SPLP
  9. C***LIBRARY SLATEC
  10. C***TYPE SINGLE 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 SPLP PACKAGE.
  18. C
  19. C***SEE ALSO SPLP
  20. C***ROUTINES CALLED IVOUT, LA05BS, PINITM, PNNZRS, PRWPGE, SASUM,
  21. C SCLOSM, SCOPY, SDOT, SPINCW, SPINIT, SPLPCE,
  22. C SPLPDM, SPLPFE, SPLPFL, SPLPMU, SPLPUP, SPOPT,
  23. C SVOUT, XERMSG
  24. C***COMMON BLOCKS LA05DS
  25. C***REVISION HISTORY (YYMMDD)
  26. C 811215 DATE WRITTEN
  27. C 890531 Changed all specific intrinsics to generic. (WRB)
  28. C 890605 Corrected references to XERRWV. (WRB)
  29. C 890605 Removed unreferenced labels. (WRB)
  30. C 891009 Removed unreferenced variable. (WRB)
  31. C 891214 Prologue converted to Version 4.0 format. (BAB)
  32. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  33. C 900328 Added TYPE section. (WRB)
  34. C 900510 Convert XERRWV calls to XERMSG calls. (RWC)
  35. C***END PROLOGUE SPLPMN
  36. REAL ABIG,AIJ,AMAT(*),ANORM,ASMALL,BASMAT(*),
  37. * BL(*),BU(*),COLNRM(*),COSTS(*),COSTSC,CSC(*),DATTRV(*),
  38. * DIRNRM,DUALS(*),DULNRM,EPS,TUNE,ERD(*),ERDNRM,ERP(*),FACTOR,GG,
  39. * ONE,PRGOPT(*),PRIMAL(*),RESNRM,RG(*),RHS(*),RHSNRM,ROPT(07),
  40. * RPRIM(*),RPRNRM,RZ(*),RZJ,SCALR,SCOSTS,SIZE,SMALL,THETA,
  41. * TOLLS,UPBND,UU,WR(*),WW(*),XLAMDA,XVAL,ZERO,RDUM(01),TOLABS
  42. C
  43. INTEGER IBASIS(*),IBB(*),IBRC(LBM,2),IMAT(*),IND(*),
  44. * IPR(*),IWR(*),INTOPT(08),IDUM(01)
  45. C
  46. C ARRAY LOCAL VARIABLES
  47. C NAME(LENGTH) DESCRIPTION
  48. C
  49. C COSTS(NVARS) COST COEFFICIENTS
  50. C PRGOPT( ) OPTION VECTOR
  51. C DATTRV( ) DATA TRANSFER VECTOR
  52. C PRIMAL(NVARS+MRELAS) AS OUTPUT IT IS PRIMAL SOLUTION OF LP.
  53. C INTERNALLY, THE FIRST NVARS POSITIONS HOLD
  54. C THE COLUMN CHECK SUMS. THE NEXT MRELAS
  55. C POSITIONS HOLD THE CLASSIFICATION FOR THE
  56. C BASIC VARIABLES -1 VIOLATES LOWER
  57. C BOUND, 0 FEASIBLE, +1 VIOLATES UPPER BOUND
  58. C DUALS(MRELAS+NVARS) DUAL SOLUTION. INTERNALLY HOLDS R.H. SIDE
  59. C AS FIRST MRELAS ENTRIES.
  60. C AMAT(LMX) SPARSE FORM OF DATA MATRIX
  61. C IMAT(LMX) SPARSE FORM OF DATA MATRIX
  62. C BL(NVARS+MRELAS) LOWER BOUNDS FOR VARIABLES
  63. C BU(NVARS+MRELAS) UPPER BOUNDS FOR VARIABLES
  64. C IND(NVARS+MRELAS) INDICATOR FOR VARIABLES
  65. C CSC(NVARS) COLUMN SCALING
  66. C IBASIS(NVARS+MRELAS) COLS. 1-MRELAS ARE BASIC, REST ARE NON-BASIC
  67. C IBB(NVARS+MRELAS) INDICATOR FOR NON-BASIC VARS., POLARITY OF
  68. C VARS., AND POTENTIALLY INFINITE VARS.
  69. C IF IBB(J).LT.0, VARIABLE J IS BASIC
  70. C IF IBB(J).GT.0, VARIABLE J IS NON-BASIC
  71. C IF IBB(J).EQ.0, VARIABLE J HAS TO BE IGNORED
  72. C BECAUSE IT WOULD CAUSE UNBOUNDED SOLN.
  73. C WHEN MOD(IBB(J),2).EQ.0, VARIABLE IS AT ITS
  74. C UPPER BOUND, OTHERWISE IT IS AT ITS LOWER
  75. C BOUND
  76. C COLNRM(NVARS) NORM OF COLUMNS
  77. C ERD(MRELAS) ERRORS IN DUAL VARIABLES
  78. C ERP(MRELAS) ERRORS IN PRIMAL VARIABLES
  79. C BASMAT(LBM) BASIS MATRIX FOR HARWELL SPARSE CODE
  80. C IBRC(LBM,2) ROW AND COLUMN POINTERS FOR BASMAT(*)
  81. C IPR(2*MRELAS) WORK ARRAY FOR HARWELL SPARSE CODE
  82. C IWR(8*MRELAS) WORK ARRAY FOR HARWELL SPARSE CODE
  83. C WR(MRELAS) WORK ARRAY FOR HARWELL SPARSE CODE
  84. C RZ(NVARS+MRELAS) REDUCED COSTS
  85. C RPRIM(MRELAS) INTERNAL PRIMAL SOLUTION
  86. C RG(NVARS+MRELAS) COLUMN WEIGHTS
  87. C WW(MRELAS) WORK ARRAY
  88. C RHS(MRELAS) HOLDS TRANSLATED RIGHT HAND SIDE
  89. C
  90. C SCALAR LOCAL VARIABLES
  91. C NAME TYPE DESCRIPTION
  92. C
  93. C LMX INTEGER LENGTH OF AMAT(*)
  94. C LPG INTEGER LENGTH OF PAGE FOR AMAT(*)
  95. C EPS REAL MACHINE PRECISION
  96. C TUNE REAL PARAMETER TO SCALE ERROR ESTIMATES
  97. C TOLLS REAL RELATIVE TOLERANCE FOR SMALL RESIDUALS
  98. C TOLABS REAL ABSOLUTE TOLERANCE FOR SMALL RESIDUALS.
  99. C USED IF RELATIVE ERROR TEST FAILS.
  100. C IN CONSTRAINT EQUATIONS
  101. C FACTOR REAL .01--DETERMINES IF BASIS IS SINGULAR
  102. C OR COMPONENT IS FEASIBLE. MAY NEED TO
  103. C BE INCREASED TO 1.E0 ON SHORT WORD
  104. C LENGTH MACHINES.
  105. C ASMALL REAL LOWER BOUND FOR NON-ZERO MAGN. IN AMAT(*)
  106. C ABIG REAL UPPER BOUND FOR NON-ZERO MAGN. IN AMAT(*)
  107. C MXITLP INTEGER MAXIMUM NUMBER OF ITERATIONS FOR LP
  108. C ITLP INTEGER ITERATION COUNTER FOR TOTAL LP ITERS
  109. C COSTSC REAL COSTS(*) SCALING
  110. C SCOSTS REAL TEMP LOC. FOR COSTSC.
  111. C XLAMDA REAL WEIGHT PARAMETER FOR PEN. METHOD.
  112. C ANORM REAL NORM OF DATA MATRIX AMAT(*)
  113. C RPRNRM REAL NORM OF THE SOLUTION
  114. C DULNRM REAL NORM OF THE DUALS
  115. C ERDNRM REAL NORM OF ERROR IN DUAL VARIABLES
  116. C DIRNRM REAL NORM OF THE DIRECTION VECTOR
  117. C RHSNRM REAL NORM OF TRANSLATED RIGHT HAND SIDE VECTOR
  118. C RESNRM REAL NORM OF RESIDUAL VECTOR FOR CHECKING
  119. C FEASIBILITY
  120. C NZBM INTEGER NUMBER OF NON-ZEROS IN BASMAT(*)
  121. C LBM INTEGER LENGTH OF BASMAT(*)
  122. C SMALL REAL EPS*ANORM USED IN HARWELL SPARSE CODE
  123. C LP INTEGER USED IN HARWELL LA05*() PACK AS OUTPUT
  124. C FILE NUMBER. SET=I1MACH(4) NOW.
  125. C UU REAL 0.1--USED IN HARWELL SPARSE CODE
  126. C FOR RELATIVE PIVOTING TOLERANCE.
  127. C GG REAL OUTPUT INFO FLAG IN HARWELL SPARSE CODE
  128. C IPLACE INTEGER INTEGER USED BY SPARSE MATRIX CODES
  129. C IENTER INTEGER NEXT COLUMN TO ENTER BASIS
  130. C NREDC INTEGER NO. OF FULL REDECOMPOSITIONS
  131. C KPRINT INTEGER LEVEL OF OUTPUT, =0-3
  132. C IDG INTEGER FORMAT AND PRECISION OF OUTPUT
  133. C ITBRC INTEGER NO. OF ITERS. BETWEEN RECALCULATING
  134. C THE ERROR IN THE PRIMAL SOLUTION.
  135. C NPP INTEGER NO. OF NEGATIVE REDUCED COSTS REQUIRED
  136. C IN PARTIAL PRICING
  137. C JSTRT INTEGER STARTING PLACE FOR PARTIAL PRICING.
  138. C
  139. LOGICAL COLSCP,SAVEDT,CONTIN,CSTSCP,UNBND,
  140. * FEAS,FINITE,FOUND,MINPRB,REDBAS,
  141. * SINGLR,SIZEUP,STPEDG,TRANS,USRBAS,ZEROLV,LOPT(08)
  142. CHARACTER*8 XERN1, XERN2
  143. EQUIVALENCE (CONTIN,LOPT(1)),(USRBAS,LOPT(2)),
  144. * (SIZEUP,LOPT(3)),(SAVEDT,LOPT(4)),(COLSCP,LOPT(5)),
  145. * (CSTSCP,LOPT(6)),(MINPRB,LOPT(7)),(STPEDG,LOPT(8)),
  146. * (IDG,INTOPT(1)),(IPAGEF,INTOPT(2)),(ISAVE,INTOPT(3)),
  147. * (MXITLP,INTOPT(4)),(KPRINT,INTOPT(5)),(ITBRC,INTOPT(6)),
  148. * (NPP,INTOPT(7)),(LPRG,INTOPT(8)),(EPS,ROPT(1)),(ASMALL,ROPT(2)),
  149. * (ABIG,ROPT(3)),(COSTSC,ROPT(4)),(TOLLS,ROPT(5)),(TUNE,ROPT(6)),
  150. * (TOLABS,ROPT(7))
  151. C
  152. C COMMON BLOCK USED BY LA05 () PACKAGE..
  153. COMMON /LA05DS/ SMALL,LP,LENL,LENU,NCP,LROW,LCOL
  154. EXTERNAL USRMAT
  155. C
  156. C SET LP=0 SO NO ERROR MESSAGES WILL PRINT WITHIN LA05 () PACKAGE.
  157. C***FIRST EXECUTABLE STATEMENT SPLPMN
  158. LP=0
  159. C
  160. C THE VALUES ZERO AND ONE.
  161. ZERO=0.E0
  162. ONE=1.E0
  163. FACTOR=0.01E0
  164. LPG=LMX-(NVARS+4)
  165. IOPT=1
  166. INFO=0
  167. UNBND=.FALSE.
  168. JSTRT=1
  169. C
  170. C PROCESS USER OPTIONS IN PRGOPT(*).
  171. C CHECK THAT ANY USER-GIVEN CHANGES ARE WELL-DEFINED.
  172. CALL SPOPT(PRGOPT,MRELAS,NVARS,INFO,CSC,IBASIS,ROPT,INTOPT,LOPT)
  173. IF (.NOT.(INFO.LT.0)) GO TO 20002
  174. GO TO 30001
  175. 20002 IF (.NOT.(CONTIN)) GO TO 20003
  176. GO TO 30002
  177. 20006 GO TO 20004
  178. C
  179. C INITIALIZE SPARSE DATA MATRIX, AMAT(*) AND IMAT(*).
  180. 20003 CALL PINITM(MRELAS,NVARS,AMAT,IMAT,LMX,IPAGEF)
  181. C
  182. C UPDATE MATRIX DATA AND CHECK BOUNDS FOR CONSISTENCY.
  183. 20004 CALL SPLPUP(USRMAT,MRELAS,NVARS,PRGOPT,DATTRV,
  184. * BL,BU,IND,INFO,AMAT,IMAT,SIZEUP,ASMALL,ABIG)
  185. IF (.NOT.(INFO.LT.0)) GO TO 20007
  186. GO TO 30001
  187. C
  188. C++ CODE FOR OUTPUT=YES IS ACTIVE
  189. 20007 IF (.NOT.(KPRINT.GE.1)) GO TO 20008
  190. GO TO 30003
  191. 20011 CONTINUE
  192. C++ CODE FOR OUTPUT=NO IS INACTIVE
  193. C++ END
  194. C
  195. C INITIALIZATION. SCALE DATA, NORMALIZE BOUNDS, FORM COLUMN
  196. C CHECK SUMS, AND FORM INITIAL BASIS MATRIX.
  197. 20008 CALL SPINIT(MRELAS,NVARS,COSTS,BL,BU,IND,PRIMAL,INFO,
  198. * AMAT,CSC,COSTSC,COLNRM,XLAMDA,ANORM,RHS,RHSNRM,
  199. * IBASIS,IBB,IMAT,LOPT)
  200. IF (.NOT.(INFO.LT.0)) GO TO 20012
  201. GO TO 30001
  202. C
  203. 20012 NREDC=0
  204. ASSIGN 20013 TO NPR004
  205. GO TO 30004
  206. 20013 IF (.NOT.(SINGLR)) GO TO 20014
  207. NERR=23
  208. CALL XERMSG ('SLATEC', 'SPLPMN',
  209. + 'IN SPLP, A SINGULAR INITIAL BASIS WAS ENCOUNTERED.', NERR,
  210. + IOPT)
  211. INFO=-NERR
  212. GO TO 30001
  213. 20014 ASSIGN 20018 TO NPR005
  214. GO TO 30005
  215. 20018 ASSIGN 20019 TO NPR006
  216. GO TO 30006
  217. 20019 ASSIGN 20020 TO NPR007
  218. GO TO 30007
  219. 20020 IF (.NOT.(USRBAS)) GO TO 20021
  220. ASSIGN 20024 TO NPR008
  221. GO TO 30008
  222. 20024 IF (.NOT.(.NOT.FEAS)) GO TO 20025
  223. NERR=24
  224. CALL XERMSG ('SLATEC', 'SPLPMN',
  225. + 'IN SPLP, AN INFEASIBLE INITIAL BASIS WAS ENCOUNTERED.', NERR,
  226. + IOPT)
  227. INFO=-NERR
  228. GO TO 30001
  229. 20025 CONTINUE
  230. 20021 ITLP=0
  231. C
  232. C LAMDA HAS BEEN SET TO A CONSTANT, PERFORM PENALTY METHOD.
  233. ASSIGN 20029 TO NPR009
  234. GO TO 30009
  235. 20029 ASSIGN 20030 TO NPR010
  236. GO TO 30010
  237. 20030 ASSIGN 20031 TO NPR006
  238. GO TO 30006
  239. 20031 ASSIGN 20032 TO NPR008
  240. GO TO 30008
  241. 20032 IF (.NOT.(.NOT.FEAS)) GO TO 20033
  242. C
  243. C SET LAMDA TO INFINITY BY SETTING COSTSC TO ZERO (SAVE THE VALUE OF
  244. C COSTSC) AND PERFORM STANDARD PHASE-1.
  245. IF(KPRINT.GE.2)CALL IVOUT(0,IDUM,'('' ENTER STANDARD PHASE-1'')',
  246. *IDG)
  247. SCOSTS=COSTSC
  248. COSTSC=ZERO
  249. ASSIGN 20036 TO NPR007
  250. GO TO 30007
  251. 20036 ASSIGN 20037 TO NPR009
  252. GO TO 30009
  253. 20037 ASSIGN 20038 TO NPR010
  254. GO TO 30010
  255. 20038 ASSIGN 20039 TO NPR006
  256. GO TO 30006
  257. 20039 ASSIGN 20040 TO NPR008
  258. GO TO 30008
  259. 20040 IF (.NOT.(FEAS)) GO TO 20041
  260. C
  261. C SET LAMDA TO ZERO, COSTSC=SCOSTS, PERFORM STANDARD PHASE-2.
  262. IF(KPRINT.GT.1)CALL IVOUT(0,IDUM,'('' ENTER STANDARD PHASE-2'')',
  263. *IDG)
  264. XLAMDA=ZERO
  265. COSTSC=SCOSTS
  266. ASSIGN 20044 TO NPR009
  267. GO TO 30009
  268. 20044 CONTINUE
  269. 20041 GO TO 20034
  270. C CHECK IF ANY BASIC VARIABLES ARE STILL CLASSIFIED AS
  271. C INFEASIBLE. IF ANY ARE, THEN THIS MAY NOT YET BE AN
  272. C OPTIMAL POINT. THEREFORE SET LAMDA TO ZERO AND TRY
  273. C TO PERFORM MORE SIMPLEX STEPS.
  274. 20033 I=1
  275. N20046=MRELAS
  276. GO TO 20047
  277. 20046 I=I+1
  278. 20047 IF ((N20046-I).LT.0) GO TO 20048
  279. IF (PRIMAL(I+NVARS).NE.ZERO) GO TO 20045
  280. GO TO 20046
  281. 20048 GO TO 20035
  282. 20045 XLAMDA=ZERO
  283. ASSIGN 20050 TO NPR009
  284. GO TO 30009
  285. 20050 CONTINUE
  286. 20034 CONTINUE
  287. C
  288. 20035 ASSIGN 20051 TO NPR011
  289. GO TO 30011
  290. 20051 IF (.NOT.(FEAS.AND.(.NOT.UNBND))) GO TO 20052
  291. INFO=1
  292. GO TO 20053
  293. 20052 IF (.NOT.((.NOT.FEAS).AND.(.NOT.UNBND))) GO TO 10001
  294. NERR=1
  295. CALL XERMSG ('SLATEC', 'SPLPMN',
  296. + 'IN SPLP, THE PROBLEM APPEARS TO BE INFEASIBLE', NERR, IOPT)
  297. INFO=-NERR
  298. GO TO 20053
  299. 10001 IF (.NOT.(FEAS .AND. UNBND)) GO TO 10002
  300. NERR=2
  301. CALL XERMSG ('SLATEC', 'SPLPMN',
  302. + 'IN SPLP, THE PROBLEM APPEARS TO HAVE NO FINITE SOLUTION.',
  303. + NERR, IOPT)
  304. INFO=-NERR
  305. GO TO 20053
  306. 10002 IF (.NOT.((.NOT.FEAS).AND.UNBND)) GO TO 10003
  307. NERR=3
  308. CALL XERMSG ('SLATEC', 'SPLPMN',
  309. + 'IN SPLP, THE PROBLEM APPEARS TO BE INFEASIBLE AND TO HAVE ' //
  310. + 'NO FINITE SOLUTION.', NERR, IOPT)
  311. INFO=-NERR
  312. 10003 CONTINUE
  313. 20053 CONTINUE
  314. C
  315. IF (.NOT.(INFO.EQ.(-1) .OR. INFO.EQ.(-3))) GO TO 20055
  316. SIZE=SASUM(NVARS,PRIMAL,1)*ANORM
  317. SIZE=SIZE/SASUM(NVARS,CSC,1)
  318. SIZE=SIZE+SASUM(MRELAS,PRIMAL(NVARS+1),1)
  319. I=1
  320. N20058=NVARS+MRELAS
  321. GO TO 20059
  322. 20058 I=I+1
  323. 20059 IF ((N20058-I).LT.0) GO TO 20060
  324. NX0066=IND(I)
  325. IF (NX0066.LT.1.OR.NX0066.GT.4) GO TO 20066
  326. GO TO (20062,20063,20064,20065), NX0066
  327. 20062 IF (.NOT.(SIZE+ABS(PRIMAL(I)-BL(I))*FACTOR.EQ.SIZE)) GO TO 20068
  328. GO TO 20058
  329. 20068 IF (.NOT.(PRIMAL(I).GT.BL(I))) GO TO 10004
  330. GO TO 20058
  331. 10004 IND(I)=-4
  332. GO TO 20067
  333. 20063 IF (.NOT.(SIZE+ABS(PRIMAL(I)-BU(I))*FACTOR.EQ.SIZE)) GO TO 20071
  334. GO TO 20058
  335. 20071 IF (.NOT.(PRIMAL(I).LT.BU(I))) GO TO 10005
  336. GO TO 20058
  337. 10005 IND(I)=-4
  338. GO TO 20067
  339. 20064 IF (.NOT.(SIZE+ABS(PRIMAL(I)-BL(I))*FACTOR.EQ.SIZE)) GO TO 20074
  340. GO TO 20058
  341. 20074 IF (.NOT.(PRIMAL(I).LT.BL(I))) GO TO 10006
  342. IND(I)=-4
  343. GO TO 20075
  344. 10006 IF (.NOT.(SIZE+ABS(PRIMAL(I)-BU(I))*FACTOR.EQ.SIZE)) GO TO 10007
  345. GO TO 20058
  346. 10007 IF (.NOT.(PRIMAL(I).GT.BU(I))) GO TO 10008
  347. IND(I)=-4
  348. GO TO 20075
  349. 10008 GO TO 20058
  350. 20075 GO TO 20067
  351. 20065 GO TO 20058
  352. 20066 CONTINUE
  353. 20067 GO TO 20058
  354. 20060 CONTINUE
  355. 20055 CONTINUE
  356. C
  357. IF (.NOT.(INFO.EQ.(-2) .OR. INFO.EQ.(-3))) GO TO 20077
  358. J=1
  359. N20080=NVARS
  360. GO TO 20081
  361. 20080 J=J+1
  362. 20081 IF ((N20080-J).LT.0) GO TO 20082
  363. IF (.NOT.(IBB(J).EQ.0)) GO TO 20084
  364. NX0091=IND(J)
  365. IF (NX0091.LT.1.OR.NX0091.GT.4) GO TO 20091
  366. GO TO (20087,20088,20089,20090), NX0091
  367. 20087 BU(J)=BL(J)
  368. IND(J)=-3
  369. GO TO 20092
  370. 20088 BL(J)=BU(J)
  371. IND(J)=-3
  372. GO TO 20092
  373. 20089 GO TO 20080
  374. 20090 BL(J)=ZERO
  375. BU(J)=ZERO
  376. IND(J)=-3
  377. 20091 CONTINUE
  378. 20092 CONTINUE
  379. 20084 GO TO 20080
  380. 20082 CONTINUE
  381. 20077 CONTINUE
  382. C++ CODE FOR OUTPUT=YES IS ACTIVE
  383. IF (.NOT.(KPRINT.GE.1)) GO TO 20093
  384. ASSIGN 20096 TO NPR012
  385. GO TO 30012
  386. 20096 CONTINUE
  387. 20093 CONTINUE
  388. C++ CODE FOR OUTPUT=NO IS INACTIVE
  389. C++ END
  390. GO TO 30001
  391. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  392. C PROCEDURE (COMPUTE RIGHT HAND SIDE)
  393. 30010 RHS(1)=ZERO
  394. CALL SCOPY(MRELAS,RHS,0,RHS,1)
  395. J=1
  396. N20098=NVARS+MRELAS
  397. GO TO 20099
  398. 20098 J=J+1
  399. 20099 IF ((N20098-J).LT.0) GO TO 20100
  400. NX0106=IND(J)
  401. IF (NX0106.LT.1.OR.NX0106.GT.4) GO TO 20106
  402. GO TO (20102,20103,20104,20105), NX0106
  403. 20102 SCALR=-BL(J)
  404. GO TO 20107
  405. 20103 SCALR=-BU(J)
  406. GO TO 20107
  407. 20104 SCALR=-BL(J)
  408. GO TO 20107
  409. 20105 SCALR=ZERO
  410. 20106 CONTINUE
  411. 20107 IF (.NOT.(SCALR.NE.ZERO)) GO TO 20108
  412. IF (.NOT.(J.LE.NVARS)) GO TO 20111
  413. I=0
  414. 20114 CALL PNNZRS(I,AIJ,IPLACE,AMAT,IMAT,J)
  415. IF (.NOT.(I.LE.0)) GO TO 20116
  416. GO TO 20115
  417. 20116 RHS(I)=RHS(I)+AIJ*SCALR
  418. GO TO 20114
  419. 20115 GO TO 20112
  420. 20111 RHS(J-NVARS)=RHS(J-NVARS)-SCALR
  421. 20112 CONTINUE
  422. 20108 GO TO 20098
  423. 20100 J=1
  424. N20119=NVARS+MRELAS
  425. GO TO 20120
  426. 20119 J=J+1
  427. 20120 IF ((N20119-J).LT.0) GO TO 20121
  428. SCALR=ZERO
  429. IF(IND(J).EQ.3.AND.MOD(IBB(J),2).EQ.0) SCALR=BU(J)-BL(J)
  430. IF (.NOT.(SCALR.NE.ZERO)) GO TO 20123
  431. IF (.NOT.(J.LE.NVARS)) GO TO 20126
  432. I=0
  433. 20129 CALL PNNZRS(I,AIJ,IPLACE,AMAT,IMAT,J)
  434. IF (.NOT.(I.LE.0)) GO TO 20131
  435. GO TO 20130
  436. 20131 RHS(I)=RHS(I)-AIJ*SCALR
  437. GO TO 20129
  438. 20130 GO TO 20127
  439. 20126 RHS(J-NVARS)=RHS(J-NVARS)+SCALR
  440. 20127 CONTINUE
  441. 20123 GO TO 20119
  442. 20121 CONTINUE
  443. GO TO NPR010, (20030,20038)
  444. C PROCEDURE (PERFORM SIMPLEX STEPS)
  445. 30009 ASSIGN 20134 TO NPR013
  446. GO TO 30013
  447. 20134 ASSIGN 20135 TO NPR014
  448. GO TO 30014
  449. 20135 IF (.NOT.(KPRINT.GT.2)) GO TO 20136
  450. CALL SVOUT(MRELAS,DUALS,'('' BASIC (INTERNAL) DUAL SOLN.'')',IDG)
  451. CALL SVOUT(NVARS+MRELAS,RZ,'('' REDUCED COSTS'')',IDG)
  452. 20136 CONTINUE
  453. 20139 ASSIGN 20141 TO NPR015
  454. GO TO 30015
  455. 20141 IF (.NOT.(.NOT. FOUND)) GO TO 20142
  456. GO TO 30016
  457. 20145 CONTINUE
  458. 20142 IF (.NOT.(FOUND)) GO TO 20146
  459. IF (KPRINT.GE.3) CALL SVOUT(MRELAS,WW,'('' SEARCH DIRECTION'')',
  460. *IDG)
  461. GO TO 30017
  462. 20149 IF (.NOT.(FINITE)) GO TO 20150
  463. GO TO 30018
  464. 20153 ASSIGN 20154 TO NPR005
  465. GO TO 30005
  466. 20154 GO TO 20151
  467. 20150 UNBND=.TRUE.
  468. IBB(IBASIS(IENTER))=0
  469. 20151 GO TO 20147
  470. 20146 GO TO 20140
  471. 20147 ITLP=ITLP+1
  472. GO TO 30019
  473. 20155 GO TO 20139
  474. 20140 CONTINUE
  475. GO TO NPR009, (20029,20037,20044,20050)
  476. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  477. C PROCEDURE (RETRIEVE SAVED DATA FROM FILE ISAVE)
  478. 30002 LPR=NVARS+4
  479. REWIND ISAVE
  480. READ(ISAVE) (AMAT(I),I=1,LPR),(IMAT(I),I=1,LPR)
  481. KEY=2
  482. IPAGE=1
  483. GO TO 20157
  484. 20156 IF (NP.LT.0) GO TO 20158
  485. 20157 LPR1=LPR+1
  486. READ(ISAVE) (AMAT(I),I=LPR1,LMX),(IMAT(I),I=LPR1,LMX)
  487. CALL PRWPGE(KEY,IPAGE,LPG,AMAT,IMAT)
  488. NP=IMAT(LMX-1)
  489. IPAGE=IPAGE+1
  490. GO TO 20156
  491. 20158 NPARM=NVARS+MRELAS
  492. READ(ISAVE) (IBASIS(I),I=1,NPARM)
  493. REWIND ISAVE
  494. GO TO 20006
  495. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  496. C PROCEDURE (SAVE DATA ON FILE ISAVE)
  497. C
  498. C SOME PAGES MAY NOT BE WRITTEN YET.
  499. 30020 IF (.NOT.(AMAT(LMX).EQ.ONE)) GO TO 20159
  500. AMAT(LMX)=ZERO
  501. KEY=2
  502. IPAGE=ABS(IMAT(LMX-1))
  503. CALL PRWPGE(KEY,IPAGE,LPG,AMAT,IMAT)
  504. C
  505. C FORCE PAGE FILE TO BE OPENED ON RESTARTS.
  506. 20159 KEY=AMAT(4)
  507. AMAT(4)=ZERO
  508. LPR=NVARS+4
  509. WRITE(ISAVE) (AMAT(I),I=1,LPR),(IMAT(I),I=1,LPR)
  510. AMAT(4)=KEY
  511. IPAGE=1
  512. KEY=1
  513. GO TO 20163
  514. 20162 IF (NP.LT.0) GO TO 20164
  515. 20163 CALL PRWPGE(KEY,IPAGE,LPG,AMAT,IMAT)
  516. LPR1=LPR+1
  517. WRITE(ISAVE) (AMAT(I),I=LPR1,LMX),(IMAT(I),I=LPR1,LMX)
  518. NP=IMAT(LMX-1)
  519. IPAGE=IPAGE+1
  520. GO TO 20162
  521. 20164 NPARM=NVARS+MRELAS
  522. WRITE(ISAVE) (IBASIS(I),I=1,NPARM)
  523. ENDFILE ISAVE
  524. C
  525. C CLOSE FILE, IPAGEF, WHERE PAGES ARE STORED. THIS IS NEEDED SO THAT
  526. C THE PAGES MAY BE RESTORED AT A CONTINUATION OF SPLP().
  527. GO TO 20317
  528. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  529. C PROCEDURE (DECOMPOSE BASIS MATRIX)
  530. C++ CODE FOR OUTPUT=YES IS ACTIVE
  531. 30004 IF (.NOT.(KPRINT.GE.2)) GO TO 20165
  532. CALL IVOUT(MRELAS,IBASIS,
  533. *'('' SUBSCRIPTS OF BASIC VARIABLES DURING REDECOMPOSITION'')',
  534. *IDG)
  535. C++ CODE FOR OUTPUT=NO IS INACTIVE
  536. C++ END
  537. C
  538. C SET RELATIVE PIVOTING FACTOR FOR USE IN LA05 () PACKAGE.
  539. 20165 UU=0.1
  540. CALL SPLPDM(
  541. *MRELAS,NVARS,LMX,LBM,NREDC,INFO,IOPT,
  542. *IBASIS,IMAT,IBRC,IPR,IWR,IND,IBB,
  543. *ANORM,EPS,UU,GG,
  544. *AMAT,BASMAT,CSC,WR,
  545. *SINGLR,REDBAS)
  546. IF (.NOT.(INFO.LT.0)) GO TO 20168
  547. GO TO 30001
  548. 20168 CONTINUE
  549. GO TO NPR004, (20013,20204,20242)
  550. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  551. C PROCEDURE (CLASSIFY VARIABLES)
  552. C
  553. C DEFINE THE CLASSIFICATION OF THE BASIC VARIABLES
  554. C -1 VIOLATES LOWER BOUND, 0 FEASIBLE, +1 VIOLATES UPPER BOUND.
  555. C (THIS INFO IS STORED IN PRIMAL(NVARS+1)-PRIMAL(NVARS+MRELAS))
  556. C TRANSLATE VARIABLE TO ITS UPPER BOUND, IF .GT. UPPER BOUND
  557. 30007 PRIMAL(NVARS+1)=ZERO
  558. CALL SCOPY(MRELAS,PRIMAL(NVARS+1),0,PRIMAL(NVARS+1),1)
  559. I=1
  560. N20172=MRELAS
  561. GO TO 20173
  562. 20172 I=I+1
  563. 20173 IF ((N20172-I).LT.0) GO TO 20174
  564. J=IBASIS(I)
  565. IF (.NOT.(IND(J).NE.4)) GO TO 20176
  566. IF (.NOT.(RPRIM(I).LT.ZERO)) GO TO 20179
  567. PRIMAL(I+NVARS)=-ONE
  568. GO TO 20180
  569. 20179 IF (.NOT.(IND(J).EQ.3)) GO TO 10009
  570. UPBND=BU(J)-BL(J)
  571. IF (J.LE.NVARS) UPBND=UPBND/CSC(J)
  572. IF (.NOT.(RPRIM(I).GT.UPBND)) GO TO 20182
  573. RPRIM(I)=RPRIM(I)-UPBND
  574. IF (.NOT.(J.LE.NVARS)) GO TO 20185
  575. K=0
  576. 20188 CALL PNNZRS(K,AIJ,IPLACE,AMAT,IMAT,J)
  577. IF (.NOT.(K.LE.0)) GO TO 20190
  578. GO TO 20189
  579. 20190 RHS(K)=RHS(K)-UPBND*AIJ*CSC(J)
  580. GO TO 20188
  581. 20189 GO TO 20186
  582. 20185 RHS(J-NVARS)=RHS(J-NVARS)+UPBND
  583. 20186 PRIMAL(I+NVARS)=ONE
  584. 20182 CONTINUE
  585. CONTINUE
  586. 10009 CONTINUE
  587. 20180 CONTINUE
  588. 20176 GO TO 20172
  589. 20174 CONTINUE
  590. GO TO NPR007, (20020,20036)
  591. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  592. C PROCEDURE (COMPUTE ERROR IN DUAL AND PRIMAL SYSTEMS)
  593. 30005 NTRIES=1
  594. GO TO 20195
  595. 20194 NTRIES=NTRIES+1
  596. 20195 IF ((2-NTRIES).LT.0) GO TO 20196
  597. CALL SPLPCE(
  598. *MRELAS,NVARS,LMX,LBM,ITLP,ITBRC,
  599. *IBASIS,IMAT,IBRC,IPR,IWR,IND,IBB,
  600. *ERDNRM,EPS,TUNE,GG,
  601. *AMAT,BASMAT,CSC,WR,WW,PRIMAL,ERD,ERP,
  602. *SINGLR,REDBAS)
  603. IF (.NOT.(.NOT. SINGLR)) GO TO 20198
  604. C++ CODE FOR OUTPUT=YES IS ACTIVE
  605. IF (.NOT.(KPRINT.GE.3)) GO TO 20201
  606. CALL SVOUT(MRELAS,ERP,'('' EST. ERROR IN PRIMAL COMPS.'')',IDG)
  607. CALL SVOUT(MRELAS,ERD,'('' EST. ERROR IN DUAL COMPS.'')',IDG)
  608. 20201 CONTINUE
  609. C++ CODE FOR OUTPUT=NO IS INACTIVE
  610. C++ END
  611. GO TO 20193
  612. 20198 IF (NTRIES.EQ.2) GO TO 20197
  613. ASSIGN 20204 TO NPR004
  614. GO TO 30004
  615. 20204 CONTINUE
  616. GO TO 20194
  617. 20196 CONTINUE
  618. 20197 NERR=26
  619. CALL XERMSG ('SLATEC', 'SPLPMN',
  620. + 'IN SPLP, MOVED TO A SINGULAR POINT. THIS SHOULD NOT HAPPEN.',
  621. + NERR, IOPT)
  622. INFO=-NERR
  623. GO TO 30001
  624. 20193 CONTINUE
  625. GO TO NPR005, (20018,20154,20243)
  626. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  627. C PROCEDURE (CHECK FEASIBILITY)
  628. C
  629. C SEE IF NEARBY FEASIBLE POINT SATISFIES THE CONSTRAINT
  630. C EQUATIONS.
  631. C
  632. C COPY RHS INTO WW(*), THEN UPDATE WW(*).
  633. 30008 CALL SCOPY(MRELAS,RHS,1,WW,1)
  634. J=1
  635. N20206=MRELAS
  636. GO TO 20207
  637. 20206 J=J+1
  638. 20207 IF ((N20206-J).LT.0) GO TO 20208
  639. IBAS=IBASIS(J)
  640. XVAL=RPRIM(J)
  641. C
  642. C ALL VARIABLES BOUNDED BELOW HAVE ZERO AS THAT BOUND.
  643. IF (IND(IBAS).LE.3) XVAL=MAX(ZERO,XVAL)
  644. C
  645. C IF THE VARIABLE HAS AN UPPER BOUND, COMPUTE THAT BOUND.
  646. IF (.NOT.(IND(IBAS).EQ.3)) GO TO 20210
  647. UPBND=BU(IBAS)-BL(IBAS)
  648. IF (IBAS.LE.NVARS) UPBND=UPBND/CSC(IBAS)
  649. XVAL=MIN(UPBND,XVAL)
  650. 20210 CONTINUE
  651. C
  652. C SUBTRACT XVAL TIMES COLUMN VECTOR FROM RIGHT-HAND SIDE IN WW(*)
  653. IF (.NOT.(XVAL.NE.ZERO)) GO TO 20213
  654. IF (.NOT.(IBAS.LE.NVARS)) GO TO 20216
  655. I=0
  656. 20219 CALL PNNZRS(I,AIJ,IPLACE,AMAT,IMAT,IBAS)
  657. IF (.NOT.(I.LE.0)) GO TO 20221
  658. GO TO 20220
  659. 20221 WW(I)=WW(I)-XVAL*AIJ*CSC(IBAS)
  660. GO TO 20219
  661. 20220 GO TO 20217
  662. 20216 IF (.NOT.(IND(IBAS).EQ.2)) GO TO 20224
  663. WW(IBAS-NVARS)=WW(IBAS-NVARS)-XVAL
  664. GO TO 20225
  665. 20224 WW(IBAS-NVARS)=WW(IBAS-NVARS)+XVAL
  666. 20225 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=SASUM(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 SCOPY(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 SPINCW(
  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', 'SPLPMN',
  711. * 'IN SPLP, 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 SCOPY(MRELAS,RHS,1,WW,1)
  750. TRANS = .FALSE.
  751. CALL LA05BS(BASMAT,IBRC,LBM,MRELAS,IPR,IWR,WR,GG,WW,TRANS)
  752. CALL SCOPY(MRELAS,WW,1,RPRIM,1)
  753. RPRNRM=SASUM(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 LA05BS(BASMAT,IBRC,LBM,MRELAS,IPR,IWR,WR,GG,DUALS,TRANS)
  774. DULNRM=SASUM(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 SPLPFE(
  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 SPLPFL(
  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 SPLPMU(
  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 SCOPY(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 PNNZRS(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 SVOUT(NVARS,COSTS,'('' ARRAY OF COSTS'')',IDG)
  908. CALL IVOUT(NVARS+MRELAS,IND,
  909. * '('' CONSTRAINT INDICATORS'')',IDG)
  910. CALL SVOUT(NVARS+MRELAS,BL,
  911. *'('' LOWER BOUNDS FOR VARIABLES (IGNORE UNUSED ENTRIES.)'')',IDG)
  912. CALL SVOUT(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)=SDOT(NVARS,COSTS,1,PRIMAL,1)
  939. CALL SVOUT(1,RDUM,
  940. * '('' OUTPUT VALUE OF THE OBJECTIVE FUNCTION'')',IDG)
  941. CALL SVOUT(NVARS+MRELAS,PRIMAL,
  942. * '('' THE OUTPUT INDEPENDENT AND DEPENDENT VARIABLES'')',IDG)
  943. CALL SVOUT(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 SVOUT(1,RDUM,'('' LENGTH OF THE EXCHANGE STEP'')',IDG)
  966. IF (.NOT.(KPRINT.GE.3)) GO TO 20311
  967. CALL SVOUT(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 SVOUT(MRELAS,RHS,'('' TRANSLATED RHS'')',IDG)
  973. CALL SVOUT(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