dpopt.f 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. *DECK DPOPT
  2. SUBROUTINE DPOPT (PRGOPT, MRELAS, NVARS, INFO, CSC, IBASIS, ROPT,
  3. + INTOPT, LOPT)
  4. C***BEGIN PROLOGUE DPOPT
  5. C***SUBSIDIARY
  6. C***PURPOSE Subsidiary to DSPLP
  7. C***LIBRARY SLATEC
  8. C***TYPE DOUBLE PRECISION (SPOPT-S, DPOPT-D)
  9. C***AUTHOR (UNKNOWN)
  10. C***DESCRIPTION
  11. C
  12. C THE EDITING REQUIRED TO CONVERT THIS SUBROUTINE FROM SINGLE TO
  13. C DOUBLE PRECISION INVOLVES THE FOLLOWING CHARACTER STRING CHANGES.
  14. C
  15. C USE AN EDITING COMMAND (CHANGE) /STRING-1/(TO)STRING-2/.
  16. C /REAL (12 BLANKS)/DOUBLE PRECISION/,/R1MACH/D1MACH/,/E0/D0/
  17. C
  18. C REVISED 821122-1045
  19. C REVISED YYMMDD-HHMM
  20. C
  21. C THIS SUBROUTINE PROCESSES THE OPTION VECTOR, PRGOPT(*),
  22. C AND VALIDATES ANY MODIFIED DATA.
  23. C
  24. C***SEE ALSO DSPLP
  25. C***ROUTINES CALLED D1MACH, XERMSG
  26. C***REVISION HISTORY (YYMMDD)
  27. C 811215 DATE WRITTEN
  28. C 890531 Changed all specific intrinsics to generic. (WRB)
  29. C 890605 Removed unreferenced labels. (WRB)
  30. C 891214 Prologue converted to Version 4.0 format. (BAB)
  31. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  32. C 900328 Added TYPE section. (WRB)
  33. C 900510 Fixed an error message. (RWC)
  34. C***END PROLOGUE DPOPT
  35. DOUBLE PRECISION ABIG,ASMALL,COSTSC,CSC(*),EPS,ONE,PRGOPT(*),
  36. * ROPT(07),TOLLS,TUNE,ZERO,D1MACH,TOLABS
  37. INTEGER IBASIS(*),INTOPT(08)
  38. LOGICAL CONTIN,USRBAS,SIZEUP,SAVEDT,COLSCP,CSTSCP,MINPRB,
  39. * STPEDG,LOPT(8)
  40. C
  41. C***FIRST EXECUTABLE STATEMENT DPOPT
  42. IOPT=1
  43. ZERO=0.D0
  44. ONE=1.D0
  45. GO TO 30001
  46. 20002 CONTINUE
  47. GO TO 30002
  48. C
  49. 20003 LOPT(1)=CONTIN
  50. LOPT(2)=USRBAS
  51. LOPT(3)=SIZEUP
  52. LOPT(4)=SAVEDT
  53. LOPT(5)=COLSCP
  54. LOPT(6)=CSTSCP
  55. LOPT(7)=MINPRB
  56. LOPT(8)=STPEDG
  57. C
  58. INTOPT(1)=IDG
  59. INTOPT(2)=IPAGEF
  60. INTOPT(3)=ISAVE
  61. INTOPT(4)=MXITLP
  62. INTOPT(5)=KPRINT
  63. INTOPT(6)=ITBRC
  64. INTOPT(7)=NPP
  65. INTOPT(8)=LPRG
  66. C
  67. ROPT(1)=EPS
  68. ROPT(2)=ASMALL
  69. ROPT(3)=ABIG
  70. ROPT(4)=COSTSC
  71. ROPT(5)=TOLLS
  72. ROPT(6)=TUNE
  73. ROPT(7)=TOLABS
  74. RETURN
  75. C
  76. C
  77. C PROCEDURE (INITIALIZE PARAMETERS AND PROCESS USER OPTIONS)
  78. 30001 CONTIN = .FALSE.
  79. USRBAS = .FALSE.
  80. SIZEUP = .FALSE.
  81. SAVEDT = .FALSE.
  82. COLSCP = .FALSE.
  83. CSTSCP = .FALSE.
  84. MINPRB = .TRUE.
  85. STPEDG = .TRUE.
  86. C
  87. C GET THE MACHINE REL. FLOATING POINT ACCURACY VALUE FROM THE
  88. C LIBRARY SUBPROGRAM, D1MACH( ).
  89. EPS=D1MACH(4)
  90. TOLLS=D1MACH(4)
  91. TUNE=ONE
  92. TOLABS=ZERO
  93. C
  94. C DEFINE NOMINAL FILE NUMBERS FOR MATRIX PAGES AND DATA SAVING.
  95. IPAGEF=1
  96. ISAVE=2
  97. ITBRC=10
  98. MXITLP=3*(NVARS+MRELAS)
  99. KPRINT=0
  100. IDG=-4
  101. NPP=NVARS
  102. LPRG=0
  103. C
  104. LAST = 1
  105. IADBIG=10000
  106. ICTMAX=1000
  107. ICTOPT= 0
  108. 20004 NEXT=PRGOPT(LAST)
  109. IF (.NOT.(NEXT.LE.0 .OR. NEXT.GT.IADBIG)) GO TO 20006
  110. C
  111. C THE CHECKS FOR SMALL OR LARGE VALUES OF NEXT ARE TO PREVENT
  112. C WORKING WITH UNDEFINED DATA.
  113. NERR=14
  114. CALL XERMSG ('SLATEC', 'DPOPT',
  115. + 'IN DSPLP, THE USER OPTION ARRAY HAS UNDEFINED DATA.', NERR,
  116. + IOPT)
  117. INFO=-NERR
  118. RETURN
  119. 20006 IF (.NOT.(NEXT.EQ.1)) GO TO 10001
  120. GO TO 20005
  121. 10001 IF (.NOT.(ICTOPT.GT.ICTMAX)) GO TO 10002
  122. NERR=15
  123. CALL XERMSG ('SLATEC', 'DPOPT',
  124. + 'IN DSPLP, OPTION ARRAY PROCESSING IS CYCLING.', NERR, IOPT)
  125. INFO=-NERR
  126. RETURN
  127. 10002 CONTINUE
  128. KEY = PRGOPT(LAST+1)
  129. C
  130. C IF KEY = 50, THIS IS TO BE A MAXIMIZATION PROBLEM
  131. C INSTEAD OF A MINIMIZATION PROBLEM.
  132. IF (.NOT.(KEY.EQ.50)) GO TO 20010
  133. MINPRB = PRGOPT(LAST+2).EQ.ZERO
  134. LDS=3
  135. GO TO 20009
  136. 20010 CONTINUE
  137. C
  138. C IF KEY = 51, THE LEVEL OF OUTPUT IS BEING MODIFIED.
  139. C KPRINT = 0, NO OUTPUT
  140. C = 1, SUMMARY OUTPUT
  141. C = 2, LOTS OF OUTPUT
  142. C = 3, EVEN MORE OUTPUT
  143. IF (.NOT.(KEY.EQ.51)) GO TO 20013
  144. KPRINT=PRGOPT(LAST+2)
  145. LDS=3
  146. GO TO 20009
  147. 20013 CONTINUE
  148. C
  149. C IF KEY = 52, REDEFINE THE FORMAT AND PRECISION USED
  150. C IN THE OUTPUT.
  151. IF (.NOT.(KEY.EQ.52)) GO TO 20016
  152. IF (PRGOPT(LAST+2).NE.ZERO) IDG=PRGOPT(LAST+3)
  153. LDS=4
  154. GO TO 20009
  155. 20016 CONTINUE
  156. C
  157. C IF KEY = 53, THE ALLOTTED SPACE FOR THE SPARSE MATRIX
  158. C STORAGE AND/OR SPARSE EQUATION SOLVING HAS BEEN CHANGED.
  159. C (PROCESSED IN DSPLP(). THIS IS TO COMPUTE THE LENGTH OF PRGOPT(*).)
  160. IF (.NOT.(KEY.EQ.53)) GO TO 20019
  161. LDS=5
  162. GO TO 20009
  163. 20019 CONTINUE
  164. C
  165. C IF KEY = 54, REDEFINE THE FILE NUMBER WHERE THE PAGES
  166. C FOR THE SPARSE MATRIX ARE STORED.
  167. IF (.NOT.(KEY.EQ.54)) GO TO 20022
  168. IF(PRGOPT(LAST+2).NE.ZERO) IPAGEF = PRGOPT(LAST+3)
  169. LDS=4
  170. GO TO 20009
  171. 20022 CONTINUE
  172. C
  173. C IF KEY = 55, A CONTINUATION FOR A PROBLEM MAY BE REQUESTED.
  174. IF (.NOT.(KEY .EQ. 55)) GO TO 20025
  175. CONTIN = PRGOPT(LAST+2).NE.ZERO
  176. LDS=3
  177. GO TO 20009
  178. 20025 CONTINUE
  179. C
  180. C IF KEY = 56, REDEFINE THE FILE NUMBER WHERE THE SAVED DATA
  181. C WILL BE STORED.
  182. IF (.NOT.(KEY.EQ.56)) GO TO 20028
  183. IF(PRGOPT(LAST+2).NE.ZERO) ISAVE = PRGOPT(LAST+3)
  184. LDS=4
  185. GO TO 20009
  186. 20028 CONTINUE
  187. C
  188. C IF KEY = 57, SAVE DATA (ON EXTERNAL FILE) AT MXITLP ITERATIONS OR
  189. C THE OPTIMUM, WHICHEVER COMES FIRST.
  190. IF (.NOT.(KEY.EQ.57)) GO TO 20031
  191. SAVEDT=PRGOPT(LAST+2).NE.ZERO
  192. LDS=3
  193. GO TO 20009
  194. 20031 CONTINUE
  195. C
  196. C IF KEY = 58, SEE IF PROBLEM IS TO RUN ONLY A GIVEN
  197. C NUMBER OF ITERATIONS.
  198. IF (.NOT.(KEY.EQ.58)) GO TO 20034
  199. IF (PRGOPT(LAST+2).NE.ZERO) MXITLP = PRGOPT(LAST+3)
  200. LDS=4
  201. GO TO 20009
  202. 20034 CONTINUE
  203. C
  204. C IF KEY = 59, SEE IF USER PROVIDES THE BASIS INDICES.
  205. IF (.NOT.(KEY .EQ. 59)) GO TO 20037
  206. USRBAS = PRGOPT(LAST+2) .NE. ZERO
  207. IF (.NOT.(USRBAS)) GO TO 20040
  208. I=1
  209. N20043=MRELAS
  210. GO TO 20044
  211. 20043 I=I+1
  212. 20044 IF ((N20043-I).LT.0) GO TO 20045
  213. IBASIS(I) = PRGOPT(LAST+2+I)
  214. GO TO 20043
  215. 20045 CONTINUE
  216. 20040 CONTINUE
  217. LDS=MRELAS+3
  218. GO TO 20009
  219. 20037 CONTINUE
  220. C
  221. C IF KEY = 60, SEE IF USER HAS PROVIDED SCALING OF COLUMNS.
  222. IF (.NOT.(KEY .EQ. 60)) GO TO 20047
  223. COLSCP = PRGOPT(LAST+2).NE.ZERO
  224. IF (.NOT.(COLSCP)) GO TO 20050
  225. J=1
  226. N20053=NVARS
  227. GO TO 20054
  228. 20053 J=J+1
  229. 20054 IF ((N20053-J).LT.0) GO TO 20055
  230. CSC(J)=ABS(PRGOPT(LAST+2+J))
  231. GO TO 20053
  232. 20055 CONTINUE
  233. 20050 CONTINUE
  234. LDS=NVARS+3
  235. GO TO 20009
  236. 20047 CONTINUE
  237. C
  238. C IF KEY = 61, SEE IF USER HAS PROVIDED SCALING OF COSTS.
  239. IF (.NOT.(KEY .EQ. 61)) GO TO 20057
  240. CSTSCP = PRGOPT(LAST+2).NE.ZERO
  241. IF (CSTSCP) COSTSC = PRGOPT(LAST+3)
  242. LDS=4
  243. GO TO 20009
  244. 20057 CONTINUE
  245. C
  246. C IF KEY = 62, SEE IF SIZE PARAMETERS ARE PROVIDED WITH THE DATA.
  247. C THESE WILL BE CHECKED AGAINST THE MATRIX ELEMENT SIZES LATER.
  248. IF (.NOT.(KEY .EQ. 62)) GO TO 20060
  249. SIZEUP = PRGOPT(LAST+2).NE.ZERO
  250. IF (.NOT.(SIZEUP)) GO TO 20063
  251. ASMALL = PRGOPT(LAST+3)
  252. ABIG = PRGOPT(LAST+4)
  253. 20063 CONTINUE
  254. LDS=5
  255. GO TO 20009
  256. 20060 CONTINUE
  257. C
  258. C IF KEY = 63, SEE IF TOLERANCE FOR LINEAR SYSTEM RESIDUAL ERROR IS
  259. C PROVIDED.
  260. IF (.NOT.(KEY .EQ. 63)) GO TO 20066
  261. IF (PRGOPT(LAST+2).NE.ZERO) TOLLS = MAX(EPS,PRGOPT(LAST+3))
  262. LDS=4
  263. GO TO 20009
  264. 20066 CONTINUE
  265. C
  266. C IF KEY = 64, SEE IF MINIMUM REDUCED COST OR STEEPEST EDGE
  267. C DESCENT IS TO BE USED FOR SELECTING VARIABLES TO ENTER BASIS.
  268. IF (.NOT.(KEY.EQ.64)) GO TO 20069
  269. STPEDG = PRGOPT(LAST+2).EQ.ZERO
  270. LDS=3
  271. GO TO 20009
  272. 20069 CONTINUE
  273. C
  274. C IF KEY = 65, SET THE NUMBER OF ITERATIONS BETWEEN RECALCULATING
  275. C THE ERROR IN THE PRIMAL SOLUTION.
  276. IF (.NOT.(KEY.EQ.65)) GO TO 20072
  277. IF (PRGOPT(LAST+2).NE.ZERO) ITBRC=MAX(ONE,PRGOPT(LAST+3))
  278. LDS=4
  279. GO TO 20009
  280. 20072 CONTINUE
  281. C
  282. C IF KEY = 66, SET THE NUMBER OF NEGATIVE REDUCED COSTS TO BE FOUND
  283. C IN THE PARTIAL PRICING STRATEGY.
  284. IF (.NOT.(KEY.EQ.66)) GO TO 20075
  285. IF (.NOT.(PRGOPT(LAST+2).NE.ZERO)) GO TO 20078
  286. NPP=MAX(PRGOPT(LAST+3),ONE)
  287. NPP=MIN(NPP,NVARS)
  288. 20078 CONTINUE
  289. LDS=4
  290. GO TO 20009
  291. 20075 CONTINUE
  292. C IF KEY = 67, CHANGE THE TUNING PARAMETER TO APPLY TO THE ERROR
  293. C ESTIMATES FOR THE PRIMAL AND DUAL SYSTEMS.
  294. IF (.NOT.(KEY.EQ.67)) GO TO 20081
  295. IF (.NOT.(PRGOPT(LAST+2).NE.ZERO)) GO TO 20084
  296. TUNE=ABS(PRGOPT(LAST+3))
  297. 20084 CONTINUE
  298. LDS=4
  299. GO TO 20009
  300. 20081 CONTINUE
  301. IF (.NOT.(KEY.EQ.68)) GO TO 20087
  302. LDS=6
  303. GO TO 20009
  304. 20087 CONTINUE
  305. C
  306. C RESET THE ABSOLUTE TOLERANCE TO BE USED ON THE FEASIBILITY
  307. C DECISION PROVIDED THE RELATIVE ERROR TEST FAILED.
  308. IF (.NOT.(KEY.EQ.69)) GO TO 20090
  309. IF(PRGOPT(LAST+2).NE.ZERO)TOLABS=PRGOPT(LAST+3)
  310. LDS=4
  311. GO TO 20009
  312. 20090 CONTINUE
  313. CONTINUE
  314. C
  315. 20009 ICTOPT = ICTOPT+1
  316. LAST = NEXT
  317. LPRG=LPRG+LDS
  318. GO TO 20004
  319. 20005 CONTINUE
  320. GO TO 20002
  321. C
  322. C PROCEDURE (VALIDATE OPTIONALLY MODIFIED DATA)
  323. C
  324. C IF USER HAS DEFINED THE BASIS, CHECK FOR VALIDITY OF INDICES.
  325. 30002 IF (.NOT.(USRBAS)) GO TO 20093
  326. I=1
  327. N20096=MRELAS
  328. GO TO 20097
  329. 20096 I=I+1
  330. 20097 IF ((N20096-I).LT.0) GO TO 20098
  331. ITEST=IBASIS(I)
  332. IF (.NOT.(ITEST.LE.0 .OR.ITEST.GT.(NVARS+MRELAS))) GO TO 20100
  333. NERR=16
  334. CALL XERMSG ('SLATEC', 'DPOPT',
  335. + 'IN DSPLP, AN INDEX OF USER-SUPPLIED BASIS IS OUT OF RANGE.',
  336. + NERR, IOPT)
  337. INFO=-NERR
  338. RETURN
  339. 20100 CONTINUE
  340. GO TO 20096
  341. 20098 CONTINUE
  342. 20093 CONTINUE
  343. C
  344. C IF USER HAS PROVIDED SIZE PARAMETERS, MAKE SURE THEY ARE ORDERED
  345. C AND POSITIVE.
  346. IF (.NOT.(SIZEUP)) GO TO 20103
  347. IF (.NOT.(ASMALL.LE.ZERO .OR. ABIG.LT.ASMALL)) GO TO 20106
  348. NERR=17
  349. CALL XERMSG ('SLATEC', 'DPOPT',
  350. + 'IN DSPLP, SIZE PARAMETERS FOR MATRIX MUST BE SMALLEST AND ' //
  351. + 'LARGEST MAGNITUDES OF NONZERO ENTRIES.', NERR, IOPT)
  352. INFO=-NERR
  353. RETURN
  354. 20106 CONTINUE
  355. 20103 CONTINUE
  356. C
  357. C THE NUMBER OF ITERATIONS OF REV. SIMPLEX STEPS MUST BE POSITIVE.
  358. IF (.NOT.(MXITLP.LE.0)) GO TO 20109
  359. NERR=18
  360. CALL XERMSG ('SLATEC', 'DPOPT',
  361. + 'IN DSPLP, THE NUMBER OF REVISED SIMPLEX STEPS BETWEEN ' //
  362. + 'CHECK-POINTS MUST BE POSITIVE.', NERR, IOPT)
  363. INFO=-NERR
  364. RETURN
  365. 20109 CONTINUE
  366. C
  367. C CHECK THAT SAVE AND PAGE FILE NUMBERS ARE DEFINED AND NOT EQUAL.
  368. IF (.NOT.(ISAVE.LE.0.OR.IPAGEF.LE.0.OR.(ISAVE.EQ.IPAGEF))) GO TO 2
  369. *0112
  370. NERR=19
  371. CALL XERMSG ('SLATEC', 'DPOPT',
  372. + 'IN DSPLP, FILE NUMBERS FOR SAVED DATA AND MATRIX PAGES ' //
  373. + 'MUST BE POSITIVE AND NOT EQUAL.', NERR, IOPT)
  374. INFO=-NERR
  375. RETURN
  376. 20112 CONTINUE
  377. CONTINUE
  378. GO TO 20003
  379. END