dbolsm.f 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188
  1. *DECK DBOLSM
  2. SUBROUTINE DBOLSM (W, MDW, MINPUT, NCOLS, BL, BU, IND, IOPT, X,
  3. + RNORM, MODE, RW, WW, SCL, IBASIS, IBB)
  4. C***BEGIN PROLOGUE DBOLSM
  5. C***SUBSIDIARY
  6. C***PURPOSE Subsidiary to DBOCLS and DBOLS
  7. C***LIBRARY SLATEC
  8. C***TYPE DOUBLE PRECISION (SBOLSM-S, DBOLSM-D)
  9. C***AUTHOR (UNKNOWN)
  10. C***DESCRIPTION
  11. C
  12. C **** Double Precision Version of SBOLSM ****
  13. C **** All INPUT and OUTPUT real variables are DOUBLE PRECISION ****
  14. C
  15. C Solve E*X = F (least squares sense) with bounds on
  16. C selected X values.
  17. C The user must have DIMENSION statements of the form:
  18. C
  19. C DIMENSION W(MDW,NCOLS+1), BL(NCOLS), BU(NCOLS),
  20. C * X(NCOLS+NX), RW(NCOLS), WW(NCOLS), SCL(NCOLS)
  21. C INTEGER IND(NCOLS), IOPT(1+NI), IBASIS(NCOLS), IBB(NCOLS)
  22. C
  23. C (Here NX=number of extra locations required for options 1,...,7;
  24. C NX=0 for no options; here NI=number of extra locations possibly
  25. C required for options 1-7; NI=0 for no options; NI=14 if all the
  26. C options are simultaneously in use.)
  27. C
  28. C INPUT
  29. C -----
  30. C
  31. C --------------------
  32. C W(MDW,*),MINPUT,NCOLS
  33. C --------------------
  34. C The array W(*,*) contains the matrix [E:F] on entry. The matrix
  35. C [E:F] has MINPUT rows and NCOLS+1 columns. This data is placed in
  36. C the array W(*,*) with E occupying the first NCOLS columns and the
  37. C right side vector F in column NCOLS+1. The row dimension, MDW, of
  38. C the array W(*,*) must satisfy the inequality MDW .ge. MINPUT.
  39. C Other values of MDW are errors. The values of MINPUT and NCOLS
  40. C must be positive. Other values are errors.
  41. C
  42. C ------------------
  43. C BL(*),BU(*),IND(*)
  44. C ------------------
  45. C These arrays contain the information about the bounds that the
  46. C solution values are to satisfy. The value of IND(J) tells the
  47. C type of bound and BL(J) and BU(J) give the explicit values for
  48. C the respective upper and lower bounds.
  49. C
  50. C 1. For IND(J)=1, require X(J) .ge. BL(J).
  51. C 2. For IND(J)=2, require X(J) .le. BU(J).
  52. C 3. For IND(J)=3, require X(J) .ge. BL(J) and
  53. C X(J) .le. BU(J).
  54. C 4. For IND(J)=4, no bounds on X(J) are required.
  55. C The values of BL(*),BL(*) are modified by the subprogram. Values
  56. C other than 1,2,3 or 4 for IND(J) are errors. In the case IND(J)=3
  57. C (upper and lower bounds) the condition BL(J) .gt. BU(J) is an
  58. C error.
  59. C
  60. C -------
  61. C IOPT(*)
  62. C -------
  63. C This is the array where the user can specify nonstandard options
  64. C for DBOLSM. Most of the time this feature can be ignored by
  65. C setting the input value IOPT(1)=99. Occasionally users may have
  66. C needs that require use of the following subprogram options. For
  67. C details about how to use the options see below: IOPT(*) CONTENTS.
  68. C
  69. C Option Number Brief Statement of Purpose
  70. C ----- ------ ----- --------- -- -------
  71. C 1 Move the IOPT(*) processing pointer.
  72. C 2 Change rank determination tolerance.
  73. C 3 Change blow-up factor that determines the
  74. C size of variables being dropped from active
  75. C status.
  76. C 4 Reset the maximum number of iterations to use
  77. C in solving the problem.
  78. C 5 The data matrix is triangularized before the
  79. C problem is solved whenever (NCOLS/MINPUT) .lt.
  80. C FAC. Change the value of FAC.
  81. C 6 Redefine the weighting matrix used for
  82. C linear independence checking.
  83. C 7 Debug output is desired.
  84. C 99 No more options to change.
  85. C
  86. C ----
  87. C X(*)
  88. C ----
  89. C This array is used to pass data associated with options 1,2,3 and
  90. C 5. Ignore this input parameter if none of these options are used.
  91. C Otherwise see below: IOPT(*) CONTENTS.
  92. C
  93. C ----------------
  94. C IBASIS(*),IBB(*)
  95. C ----------------
  96. C These arrays must be initialized by the user. The values
  97. C IBASIS(J)=J, J=1,...,NCOLS
  98. C IBB(J) =1, J=1,...,NCOLS
  99. C are appropriate except when using nonstandard features.
  100. C
  101. C ------
  102. C SCL(*)
  103. C ------
  104. C This is the array of scaling factors to use on the columns of the
  105. C matrix E. These values must be defined by the user. To suppress
  106. C any column scaling set SCL(J)=1.0, J=1,...,NCOLS.
  107. C
  108. C OUTPUT
  109. C ------
  110. C
  111. C ----------
  112. C X(*),RNORM
  113. C ----------
  114. C The array X(*) contains a solution (if MODE .ge. 0 or .eq. -22)
  115. C for the constrained least squares problem. The value RNORM is the
  116. C minimum residual vector length.
  117. C
  118. C ----
  119. C MODE
  120. C ----
  121. C The sign of mode determines whether the subprogram has completed
  122. C normally, or encountered an error condition or abnormal status.
  123. C A value of MODE .ge. 0 signifies that the subprogram has completed
  124. C normally. The value of MODE (.ge. 0) is the number of variables
  125. C in an active status: not at a bound nor at the value ZERO, for
  126. C the case of free variables. A negative value of MODE will be one
  127. C of the 18 cases -38,-37,...,-22, or -1. Values .lt. -1 correspond
  128. C to an abnormal completion of the subprogram. To understand the
  129. C abnormal completion codes see below: ERROR MESSAGES for DBOLSM
  130. C An approximate solution will be returned to the user only when
  131. C maximum iterations is reached, MODE=-22.
  132. C
  133. C -----------
  134. C RW(*),WW(*)
  135. C -----------
  136. C These are working arrays each with NCOLS entries. The array RW(*)
  137. C contains the working (scaled, nonactive) solution values. The
  138. C array WW(*) contains the working (scaled, active) gradient vector
  139. C values.
  140. C
  141. C ----------------
  142. C IBASIS(*),IBB(*)
  143. C ----------------
  144. C These arrays contain information about the status of the solution
  145. C when MODE .ge. 0. The indices IBASIS(K), K=1,...,MODE, show the
  146. C nonactive variables; indices IBASIS(K), K=MODE+1,..., NCOLS are
  147. C the active variables. The value (IBB(J)-1) is the number of times
  148. C variable J was reflected from its upper bound. (Normally the user
  149. C can ignore these parameters.)
  150. C
  151. C IOPT(*) CONTENTS
  152. C ------- --------
  153. C The option array allows a user to modify internal variables in
  154. C the subprogram without recompiling the source code. A central
  155. C goal of the initial software design was to do a good job for most
  156. C people. Thus the use of options will be restricted to a select
  157. C group of users. The processing of the option array proceeds as
  158. C follows: a pointer, here called LP, is initially set to the value
  159. C 1. The value is updated as the options are processed. At the
  160. C pointer position the option number is extracted and used for
  161. C locating other information that allows for options to be changed.
  162. C The portion of the array IOPT(*) that is used for each option is
  163. C fixed; the user and the subprogram both know how many locations
  164. C are needed for each option. A great deal of error checking is
  165. C done by the subprogram on the contents of the option array.
  166. C Nevertheless it is still possible to give the subprogram optional
  167. C input that is meaningless. For example, some of the options use
  168. C the location X(NCOLS+IOFF) for passing data. The user must manage
  169. C the allocation of these locations when more than one piece of
  170. C option data is being passed to the subprogram.
  171. C
  172. C 1
  173. C -
  174. C Move the processing pointer (either forward or backward) to the
  175. C location IOPT(LP+1). The processing pointer is moved to location
  176. C LP+2 of IOPT(*) in case IOPT(LP)=-1. For example to skip over
  177. C locations 3,...,NCOLS+2 of IOPT(*),
  178. C
  179. C IOPT(1)=1
  180. C IOPT(2)=NCOLS+3
  181. C (IOPT(I), I=3,...,NCOLS+2 are not defined here.)
  182. C IOPT(NCOLS+3)=99
  183. C CALL DBOLSM
  184. C
  185. C CAUTION: Misuse of this option can yield some very hard-to-find
  186. C bugs. Use it with care.
  187. C
  188. C 2
  189. C -
  190. C The algorithm that solves the bounded least squares problem
  191. C iteratively drops columns from the active set. This has the
  192. C effect of joining a new column vector to the QR factorization of
  193. C the rectangular matrix consisting of the partially triangularized
  194. C nonactive columns. After triangularizing this matrix a test is
  195. C made on the size of the pivot element. The column vector is
  196. C rejected as dependent if the magnitude of the pivot element is
  197. C .le. TOL* magnitude of the column in components strictly above
  198. C the pivot element. Nominally the value of this (rank) tolerance
  199. C is TOL = SQRT(R1MACH(4)). To change only the value of TOL, for
  200. C example,
  201. C
  202. C X(NCOLS+1)=TOL
  203. C IOPT(1)=2
  204. C IOPT(2)=1
  205. C IOPT(3)=99
  206. C CALL DBOLSM
  207. C
  208. C Generally, if LP is the processing pointer for IOPT(*),
  209. C
  210. C X(NCOLS+IOFF)=TOL
  211. C IOPT(LP)=2
  212. C IOPT(LP+1)=IOFF
  213. C .
  214. C CALL DBOLSM
  215. C
  216. C The required length of IOPT(*) is increased by 2 if option 2 is
  217. C used; The required length of X(*) is increased by 1. A value of
  218. C IOFF .le. 0 is an error. A value of TOL .le. R1MACH(4) gives a
  219. C warning message; it is not considered an error.
  220. C
  221. C 3
  222. C -
  223. C A solution component is left active (not used) if, roughly
  224. C speaking, it seems too large. Mathematically the new component is
  225. C left active if the magnitude is .ge.((vector norm of F)/(matrix
  226. C norm of E))/BLOWUP. Nominally the factor BLOWUP = SQRT(R1MACH(4)).
  227. C To change only the value of BLOWUP, for example,
  228. C
  229. C X(NCOLS+2)=BLOWUP
  230. C IOPT(1)=3
  231. C IOPT(2)=2
  232. C IOPT(3)=99
  233. C CALL DBOLSM
  234. C
  235. C Generally, if LP is the processing pointer for IOPT(*),
  236. C
  237. C X(NCOLS+IOFF)=BLOWUP
  238. C IOPT(LP)=3
  239. C IOPT(LP+1)=IOFF
  240. C .
  241. C CALL DBOLSM
  242. C
  243. C The required length of IOPT(*) is increased by 2 if option 3 is
  244. C used; the required length of X(*) is increased by 1. A value of
  245. C IOFF .le. 0 is an error. A value of BLOWUP .le. 0.0 is an error.
  246. C
  247. C 4
  248. C -
  249. C Normally the algorithm for solving the bounded least squares
  250. C problem requires between NCOLS/3 and NCOLS drop-add steps to
  251. C converge. (this remark is based on examining a small number of
  252. C test cases.) The amount of arithmetic for such problems is
  253. C typically about twice that required for linear least squares if
  254. C there are no bounds and if plane rotations are used in the
  255. C solution method. Convergence of the algorithm, while
  256. C mathematically certain, can be much slower than indicated. To
  257. C avoid this potential but unlikely event ITMAX drop-add steps are
  258. C permitted. Nominally ITMAX=5*(MAX(MINPUT,NCOLS)). To change the
  259. C value of ITMAX, for example,
  260. C
  261. C IOPT(1)=4
  262. C IOPT(2)=ITMAX
  263. C IOPT(3)=99
  264. C CALL DBOLSM
  265. C
  266. C Generally, if LP is the processing pointer for IOPT(*),
  267. C
  268. C IOPT(LP)=4
  269. C IOPT(LP+1)=ITMAX
  270. C .
  271. C CALL DBOLSM
  272. C
  273. C The value of ITMAX must be .gt. 0. Other values are errors. Use
  274. C of this option increases the required length of IOPT(*) by 2.
  275. C
  276. C 5
  277. C -
  278. C For purposes of increased efficiency the MINPUT by NCOLS+1 data
  279. C matrix [E:F] is triangularized as a first step whenever MINPUT
  280. C satisfies FAC*MINPUT .gt. NCOLS. Nominally FAC=0.75. To change the
  281. C value of FAC,
  282. C
  283. C X(NCOLS+3)=FAC
  284. C IOPT(1)=5
  285. C IOPT(2)=3
  286. C IOPT(3)=99
  287. C CALL DBOLSM
  288. C
  289. C Generally, if LP is the processing pointer for IOPT(*),
  290. C
  291. C X(NCOLS+IOFF)=FAC
  292. C IOPT(LP)=5
  293. C IOPT(LP+1)=IOFF
  294. C .
  295. C CALL DBOLSM
  296. C
  297. C The value of FAC must be nonnegative. Other values are errors.
  298. C Resetting FAC=0.0 suppresses the initial triangularization step.
  299. C Use of this option increases the required length of IOPT(*) by 2;
  300. C The required length of of X(*) is increased by 1.
  301. C
  302. C 6
  303. C -
  304. C The norm used in testing the magnitudes of the pivot element
  305. C compared to the mass of the column above the pivot line can be
  306. C changed. The type of change that this option allows is to weight
  307. C the components with an index larger than MVAL by the parameter
  308. C WT. Normally MVAL=0 and WT=1. To change both the values MVAL and
  309. C WT, where LP is the processing pointer for IOPT(*),
  310. C
  311. C X(NCOLS+IOFF)=WT
  312. C IOPT(LP)=6
  313. C IOPT(LP+1)=IOFF
  314. C IOPT(LP+2)=MVAL
  315. C
  316. C Use of this option increases the required length of IOPT(*) by 3.
  317. C The length of X(*) is increased by 1. Values of MVAL must be
  318. C nonnegative and not greater than MINPUT. Other values are errors.
  319. C The value of WT must be positive. Any other value is an error. If
  320. C either error condition is present a message will be printed.
  321. C
  322. C 7
  323. C -
  324. C Debug output, showing the detailed add-drop steps for the
  325. C constrained least squares problem, is desired. This option is
  326. C intended to be used to locate suspected bugs.
  327. C
  328. C 99
  329. C --
  330. C There are no more options to change.
  331. C
  332. C The values for options are 1,...,7,99, and are the only ones
  333. C permitted. Other values are errors. Options -99,-1,...,-7 mean
  334. C that the repective options 99,1,...,7 are left at their default
  335. C values. An example is the option to modify the (rank) tolerance:
  336. C
  337. C X(NCOLS+1)=TOL
  338. C IOPT(1)=-2
  339. C IOPT(2)=1
  340. C IOPT(3)=99
  341. C
  342. C Error Messages for DBOLSM
  343. C ----- -------- --- ---------
  344. C -22 MORE THAN ITMAX = ... ITERATIONS SOLVING BOUNDED LEAST
  345. C SQUARES PROBLEM.
  346. C
  347. C -23 THE OPTION NUMBER = ... IS NOT DEFINED.
  348. C
  349. C -24 THE OFFSET = ... BEYOND POSTION NCOLS = ... MUST BE POSITIVE
  350. C FOR OPTION NUMBER 2.
  351. C
  352. C -25 THE TOLERANCE FOR RANK DETERMINATION = ... IS LESS THAN
  353. C MACHINE PRECISION = ....
  354. C
  355. C -26 THE OFFSET = ... BEYOND POSITION NCOLS = ... MUST BE POSTIVE
  356. C FOR OPTION NUMBER 3.
  357. C
  358. C -27 THE RECIPROCAL OF THE BLOW-UP FACTOR FOR REJECTING VARIABLES
  359. C MUST BE POSITIVE. NOW = ....
  360. C
  361. C -28 THE MAXIMUM NUMBER OF ITERATIONS = ... MUST BE POSITIVE.
  362. C
  363. C -29 THE OFFSET = ... BEYOND POSITION NCOLS = ... MUST BE POSTIVE
  364. C FOR OPTION NUMBER 5.
  365. C
  366. C -30 THE FACTOR (NCOLS/MINPUT) WHERE PRETRIANGULARIZING IS
  367. C PERFORMED MUST BE NONNEGATIVE. NOW = ....
  368. C
  369. C -31 THE NUMBER OF ROWS = ... MUST BE POSITIVE.
  370. C
  371. C -32 THE NUMBER OF COLUMNS = ... MUST BE POSTIVE.
  372. C
  373. C -33 THE ROW DIMENSION OF W(,) = ... MUST BE .GE. THE NUMBER OF
  374. C ROWS = ....
  375. C
  376. C -34 FOR J = ... THE CONSTRAINT INDICATOR MUST BE 1-4.
  377. C
  378. C -35 FOR J = ... THE LOWER BOUND = ... IS .GT. THE UPPER BOUND =
  379. C ....
  380. C
  381. C -36 THE INPUT ORDER OF COLUMNS = ... IS NOT BETWEEN 1 AND NCOLS
  382. C = ....
  383. C
  384. C -37 THE BOUND POLARITY FLAG IN COMPONENT J = ... MUST BE
  385. C POSITIVE. NOW = ....
  386. C
  387. C -38 THE ROW SEPARATOR TO APPLY WEIGHTING (...) MUST LIE BETWEEN
  388. C 0 AND MINPUT = .... WEIGHT = ... MUST BE POSITIVE.
  389. C
  390. C***SEE ALSO DBOCLS, DBOLS
  391. C***ROUTINES CALLED D1MACH, DAXPY, DCOPY, DDOT, DMOUT, DNRM2, DROT,
  392. C DROTG, DSWAP, DVOUT, IVOUT, XERMSG
  393. C***REVISION HISTORY (YYMMDD)
  394. C 821220 DATE WRITTEN
  395. C 891214 Prologue converted to Version 4.0 format. (BAB)
  396. C 900328 Added TYPE section. (WRB)
  397. C 900510 Convert XERRWV calls to XERMSG calls. (RWC)
  398. C 920422 Fixed usage of MINPUT. (WRB)
  399. C 901009 Editorial changes, code now reads from top to bottom. (RWC)
  400. C***END PROLOGUE DBOLSM
  401. C
  402. C PURPOSE
  403. C -------
  404. C THIS IS THE MAIN SUBPROGRAM THAT SOLVES THE BOUNDED
  405. C LEAST SQUARES PROBLEM. THE PROBLEM SOLVED HERE IS:
  406. C
  407. C SOLVE E*X = F (LEAST SQUARES SENSE)
  408. C WITH BOUNDS ON SELECTED X VALUES.
  409. C
  410. C TO CHANGE THIS SUBPROGRAM FROM SINGLE TO DOUBLE PRECISION BEGIN
  411. C EDITING AT THE CARD 'C++'.
  412. C CHANGE THE SUBPROGRAM NAME TO DBOLSM AND THE STRINGS
  413. C /SAXPY/ TO /DAXPY/, /SCOPY/ TO /DCOPY/,
  414. C /SDOT/ TO /DDOT/, /SNRM2/ TO /DNRM2/,
  415. C /SROT/ TO /DROT/, /SROTG/ TO /DROTG/, /R1MACH/ TO /D1MACH/,
  416. C /SVOUT/ TO /DVOUT/, /SMOUT/ TO /DMOUT/,
  417. C /SSWAP/ TO /DSWAP/, /E0/ TO /D0/,
  418. C /REAL / TO /DOUBLE PRECISION/.
  419. C++
  420. C
  421. DOUBLE PRECISION W(MDW,*),BL(*),BU(*)
  422. DOUBLE PRECISION X(*),RW(*),WW(*),SCL(*)
  423. DOUBLE PRECISION ALPHA,BETA,BOU,COLABV,COLBLO
  424. DOUBLE PRECISION CL1,CL2,CL3,ONE,BIG
  425. DOUBLE PRECISION FAC,RNORM,SC,SS,T,TOLIND,WT
  426. DOUBLE PRECISION TWO,T1,T2,WBIG,WLARGE,WMAG,XNEW
  427. DOUBLE PRECISION ZERO,DDOT,DNRM2
  428. DOUBLE PRECISION D1MACH,TOLSZE
  429. INTEGER IBASIS(*),IBB(*),IND(*),IOPT(*)
  430. LOGICAL FOUND,CONSTR
  431. CHARACTER*8 XERN1, XERN2
  432. CHARACTER*16 XERN3, XERN4
  433. C
  434. PARAMETER (ZERO=0.0D0, ONE=1.0D0, TWO=2.0D0)
  435. C
  436. INEXT(IDUM) = MIN(IDUM+1,MROWS)
  437. C***FIRST EXECUTABLE STATEMENT DBOLSM
  438. C
  439. C Verify that the problem dimensions are defined properly.
  440. C
  441. IF (MINPUT.LE.0) THEN
  442. WRITE (XERN1, '(I8)') MINPUT
  443. CALL XERMSG ('SLATEC', 'DBOLSM', 'THE NUMBER OF ROWS = ' //
  444. * XERN1 // ' MUST BE POSITIVE.', 31, 1)
  445. MODE = -31
  446. RETURN
  447. ENDIF
  448. C
  449. IF (NCOLS.LE.0) THEN
  450. WRITE (XERN1, '(I8)') NCOLS
  451. CALL XERMSG ('SLATEC', 'DBOLSM', 'THE NUMBER OF COLUMNS = ' //
  452. * XERN1 // ' MUST BE POSITIVE.', 32, 1)
  453. MODE = -32
  454. RETURN
  455. ENDIF
  456. C
  457. IF (MDW.LT.MINPUT) THEN
  458. WRITE (XERN1, '(I8)') MDW
  459. WRITE (XERN2, '(I8)') MINPUT
  460. CALL XERMSG ('SLATEC', 'DBOLSM',
  461. * 'THE ROW DIMENSION OF W(,) = ' // XERN1 //
  462. * ' MUST BE .GE. THE NUMBER OF ROWS = ' // XERN2, 33, 1)
  463. MODE = -33
  464. RETURN
  465. ENDIF
  466. C
  467. C Verify that bound information is correct.
  468. C
  469. DO 10 J = 1,NCOLS
  470. IF (IND(J).LT.1 .OR. IND(J).GT.4) THEN
  471. WRITE (XERN1, '(I8)') J
  472. WRITE (XERN2, '(I8)') IND(J)
  473. CALL XERMSG ('SLATEC', 'DBOLSM', 'FOR J = ' // XERN1 //
  474. * ' THE CONSTRAINT INDICATOR MUST BE 1-4', 34, 1)
  475. MODE = -34
  476. RETURN
  477. ENDIF
  478. 10 CONTINUE
  479. C
  480. DO 20 J = 1,NCOLS
  481. IF (IND(J).EQ.3) THEN
  482. IF (BU(J).LT.BL(J)) THEN
  483. WRITE (XERN1, '(I8)') J
  484. WRITE (XERN3, '(1PD15.6)') BL(J)
  485. WRITE (XERN4, '(1PD15.6)') BU(J)
  486. CALL XERMSG ('SLATEC', 'DBOLSM', 'FOR J = ' // XERN1
  487. * // ' THE LOWER BOUND = ' // XERN3 //
  488. * ' IS .GT. THE UPPER BOUND = ' // XERN4, 35, 1)
  489. MODE = -35
  490. RETURN
  491. ENDIF
  492. ENDIF
  493. 20 CONTINUE
  494. C
  495. C Check that permutation and polarity arrays have been set.
  496. C
  497. DO 30 J = 1,NCOLS
  498. IF (IBASIS(J).LT.1 .OR. IBASIS(J).GT.NCOLS) THEN
  499. WRITE (XERN1, '(I8)') IBASIS(J)
  500. WRITE (XERN2, '(I8)') NCOLS
  501. CALL XERMSG ('SLATEC', 'DBOLSM',
  502. * 'THE INPUT ORDER OF COLUMNS = ' // XERN1 //
  503. * ' IS NOT BETWEEN 1 AND NCOLS = ' // XERN2, 36, 1)
  504. MODE = -36
  505. RETURN
  506. ENDIF
  507. C
  508. IF (IBB(J).LE.0) THEN
  509. WRITE (XERN1, '(I8)') J
  510. WRITE (XERN2, '(I8)') IBB(J)
  511. CALL XERMSG ('SLATEC', 'DBOLSM',
  512. * 'THE BOUND POLARITY FLAG IN COMPONENT J = ' // XERN1 //
  513. * ' MUST BE POSITIVE.$$NOW = ' // XERN2, 37, 1)
  514. MODE = -37
  515. RETURN
  516. ENDIF
  517. 30 CONTINUE
  518. C
  519. C Process the option array.
  520. C
  521. FAC = 0.75D0
  522. TOLIND = SQRT(D1MACH(4))
  523. TOLSZE = SQRT(D1MACH(4))
  524. ITMAX = 5*MAX(MINPUT,NCOLS)
  525. WT = ONE
  526. MVAL = 0
  527. IPRINT = 0
  528. C
  529. C Changes to some parameters can occur through the option array,
  530. C IOPT(*). Process this array looking carefully for input data
  531. C errors.
  532. C
  533. LP = 0
  534. LDS = 0
  535. C
  536. C Test for no more options.
  537. C
  538. 590 LP = LP + LDS
  539. IP = IOPT(LP+1)
  540. JP = ABS(IP)
  541. IF (IP.EQ.99) THEN
  542. GO TO 470
  543. ELSE IF (JP.EQ.99) THEN
  544. LDS = 1
  545. ELSE IF (JP.EQ.1) THEN
  546. C
  547. C Move the IOPT(*) processing pointer.
  548. C
  549. IF (IP.GT.0) THEN
  550. LP = IOPT(LP+2) - 1
  551. LDS = 0
  552. ELSE
  553. LDS = 2
  554. ENDIF
  555. ELSE IF (JP.EQ.2) THEN
  556. C
  557. C Change tolerance for rank determination.
  558. C
  559. IF (IP.GT.0) THEN
  560. IOFF = IOPT(LP+2)
  561. IF (IOFF.LE.0) THEN
  562. WRITE (XERN1, '(I8)') IOFF
  563. WRITE (XERN2, '(I8)') NCOLS
  564. CALL XERMSG ('SLATEC', 'DBOLSM', 'THE OFFSET = ' //
  565. * XERN1 // ' BEYOND POSITION NCOLS = ' // XERN2 //
  566. * ' MUST BE POSITIVE FOR OPTION NUMBER 2.', 24, 1)
  567. MODE = -24
  568. RETURN
  569. ENDIF
  570. C
  571. TOLIND = X(NCOLS+IOFF)
  572. IF (TOLIND.LT.D1MACH(4)) THEN
  573. WRITE (XERN3, '(1PD15.6)') TOLIND
  574. WRITE (XERN4, '(1PD15.6)') D1MACH(4)
  575. CALL XERMSG ('SLATEC', 'DBOLSM',
  576. * 'THE TOLERANCE FOR RANK DETERMINATION = ' // XERN3
  577. * // ' IS LESS THAN MACHINE PRECISION = ' // XERN4,
  578. * 25, 0)
  579. MODE = -25
  580. ENDIF
  581. ENDIF
  582. LDS = 2
  583. ELSE IF (JP.EQ.3) THEN
  584. C
  585. C Change blowup factor for allowing variables to become
  586. C inactive.
  587. C
  588. IF (IP.GT.0) THEN
  589. IOFF = IOPT(LP+2)
  590. IF (IOFF.LE.0) THEN
  591. WRITE (XERN1, '(I8)') IOFF
  592. WRITE (XERN2, '(I8)') NCOLS
  593. CALL XERMSG ('SLATEC', 'DBOLSM', 'THE OFFSET = ' //
  594. * XERN1 // ' BEYOND POSITION NCOLS = ' // XERN2 //
  595. * ' MUST BE POSITIVE FOR OPTION NUMBER 3.', 26, 1)
  596. MODE = -26
  597. RETURN
  598. ENDIF
  599. C
  600. TOLSZE = X(NCOLS+IOFF)
  601. IF (TOLSZE.LE.ZERO) THEN
  602. WRITE (XERN3, '(1PD15.6)') TOLSZE
  603. CALL XERMSG ('SLATEC', 'DBOLSM', 'THE RECIPROCAL ' //
  604. * 'OF THE BLOW-UP FACTOR FOR REJECTING VARIABLES ' //
  605. * 'MUST BE POSITIVE.$$NOW = ' // XERN3, 27, 1)
  606. MODE = -27
  607. RETURN
  608. ENDIF
  609. ENDIF
  610. LDS = 2
  611. ELSE IF (JP.EQ.4) THEN
  612. C
  613. C Change the maximum number of iterations allowed.
  614. C
  615. IF (IP.GT.0) THEN
  616. ITMAX = IOPT(LP+2)
  617. IF (ITMAX.LE.0) THEN
  618. WRITE (XERN1, '(I8)') ITMAX
  619. CALL XERMSG ('SLATEC', 'DBOLSM',
  620. * 'THE MAXIMUM NUMBER OF ITERATIONS = ' // XERN1 //
  621. * ' MUST BE POSITIVE.', 28, 1)
  622. MODE = -28
  623. RETURN
  624. ENDIF
  625. ENDIF
  626. LDS = 2
  627. ELSE IF (JP.EQ.5) THEN
  628. C
  629. C Change the factor for pretriangularizing the data matrix.
  630. C
  631. IF (IP.GT.0) THEN
  632. IOFF = IOPT(LP+2)
  633. IF (IOFF.LE.0) THEN
  634. WRITE (XERN1, '(I8)') IOFF
  635. WRITE (XERN2, '(I8)') NCOLS
  636. CALL XERMSG ('SLATEC', 'DBOLSM', 'THE OFFSET = ' //
  637. * XERN1 // ' BEYOND POSITION NCOLS = ' // XERN2 //
  638. * ' MUST BE POSITIVE FOR OPTION NUMBER 5.', 29, 1)
  639. MODE = -29
  640. RETURN
  641. ENDIF
  642. C
  643. FAC = X(NCOLS+IOFF)
  644. IF (FAC.LT.ZERO) THEN
  645. WRITE (XERN3, '(1PD15.6)') FAC
  646. CALL XERMSG ('SLATEC', 'DBOLSM',
  647. * 'THE FACTOR (NCOLS/MINPUT) WHERE PRE-' //
  648. * 'TRIANGULARIZING IS PERFORMED MUST BE NON-' //
  649. * 'NEGATIVE.$$NOW = ' // XERN3, 30, 0)
  650. MODE = -30
  651. RETURN
  652. ENDIF
  653. ENDIF
  654. LDS = 2
  655. ELSE IF (JP.EQ.6) THEN
  656. C
  657. C Change the weighting factor (from 1.0) to apply to components
  658. C numbered .gt. MVAL (initially set to 1.) This trick is needed
  659. C for applications of this subprogram to the heavily weighted
  660. C least squares problem that come from equality constraints.
  661. C
  662. IF (IP.GT.0) THEN
  663. IOFF = IOPT(LP+2)
  664. MVAL = IOPT(LP+3)
  665. WT = X(NCOLS+IOFF)
  666. ENDIF
  667. C
  668. IF (MVAL.LT.0 .OR. MVAL.GT.MINPUT .OR. WT.LE.ZERO) THEN
  669. WRITE (XERN1, '(I8)') MVAL
  670. WRITE (XERN2, '(I8)') MINPUT
  671. WRITE (XERN3, '(1PD15.6)') WT
  672. CALL XERMSG ('SLATEC', 'DBOLSM',
  673. * 'THE ROW SEPARATOR TO APPLY WEIGHTING (' // XERN1 //
  674. * ') MUST LIE BETWEEN 0 AND MINPUT = ' // XERN2 //
  675. * '.$$WEIGHT = ' // XERN3 // ' MUST BE POSITIVE.', 38, 0)
  676. MODE = -38
  677. RETURN
  678. ENDIF
  679. LDS = 3
  680. ELSE IF (JP.EQ.7) THEN
  681. C
  682. C Turn on debug output.
  683. C
  684. IF (IP.GT.0) IPRINT = 1
  685. LDS = 2
  686. ELSE
  687. WRITE (XERN1, '(I8)') IP
  688. CALL XERMSG ('SLATEC', 'DBOLSM', 'THE OPTION NUMBER = ' //
  689. * XERN1 // ' IS NOT DEFINED.', 23, 1)
  690. MODE = -23
  691. RETURN
  692. ENDIF
  693. GO TO 590
  694. C
  695. C Pretriangularize rectangular arrays of certain sizes for
  696. C increased efficiency.
  697. C
  698. 470 IF (FAC*MINPUT.GT.NCOLS) THEN
  699. DO 490 J = 1,NCOLS+1
  700. DO 480 I = MINPUT,J+MVAL+1,-1
  701. CALL DROTG(W(I-1,J),W(I,J),SC,SS)
  702. W(I,J) = ZERO
  703. CALL DROT(NCOLS-J+1,W(I-1,J+1),MDW,W(I,J+1),MDW,SC,SS)
  704. 480 CONTINUE
  705. 490 CONTINUE
  706. MROWS = NCOLS + MVAL + 1
  707. ELSE
  708. MROWS = MINPUT
  709. ENDIF
  710. C
  711. C Set the X(*) array to zero so all components are defined.
  712. C
  713. CALL DCOPY(NCOLS,ZERO,0,X,1)
  714. C
  715. C The arrays IBASIS(*) and IBB(*) are initialized by the calling
  716. C program and the column scaling is defined in the calling program.
  717. C 'BIG' is plus infinity on this machine.
  718. C
  719. BIG = D1MACH(2)
  720. DO 550 J = 1,NCOLS
  721. IF (IND(J).EQ.1) THEN
  722. BU(J) = BIG
  723. ELSE IF (IND(J).EQ.2) THEN
  724. BL(J) = -BIG
  725. ELSE IF (IND(J).EQ.4) THEN
  726. BL(J) = -BIG
  727. BU(J) = BIG
  728. ENDIF
  729. 550 CONTINUE
  730. C
  731. DO 570 J = 1,NCOLS
  732. IF ((BL(J).LE.ZERO.AND.ZERO.LE.BU(J).AND.ABS(BU(J)).LT.
  733. * ABS(BL(J))) .OR. BU(J).LT.ZERO) THEN
  734. T = BU(J)
  735. BU(J) = -BL(J)
  736. BL(J) = -T
  737. SCL(J) = -SCL(J)
  738. DO 560 I = 1,MROWS
  739. W(I,J) = -W(I,J)
  740. 560 CONTINUE
  741. ENDIF
  742. C
  743. C Indices in set T(=TIGHT) are denoted by negative values
  744. C of IBASIS(*).
  745. C
  746. IF (BL(J).GE.ZERO) THEN
  747. IBASIS(J) = -IBASIS(J)
  748. T = -BL(J)
  749. BU(J) = BU(J) + T
  750. CALL DAXPY(MROWS,T,W(1,J),1,W(1,NCOLS+1),1)
  751. ENDIF
  752. 570 CONTINUE
  753. C
  754. NSETB = 0
  755. ITER = 0
  756. C
  757. IF (IPRINT.GT.0) THEN
  758. CALL DMOUT(MROWS,NCOLS+1,MDW,W,'('' PRETRI. INPUT MATRIX'')',
  759. * -4)
  760. CALL DVOUT(NCOLS,BL,'('' LOWER BOUNDS'')',-4)
  761. CALL DVOUT(NCOLS,BU,'('' UPPER BOUNDS'')',-4)
  762. ENDIF
  763. C
  764. 580 ITER = ITER + 1
  765. IF (ITER.GT.ITMAX) THEN
  766. WRITE (XERN1, '(I8)') ITMAX
  767. CALL XERMSG ('SLATEC', 'DBOLSM', 'MORE THAN ITMAX = ' // XERN1
  768. * // ' ITERATIONS SOLVING BOUNDED LEAST SQUARES PROBLEM.',
  769. * 22, 1)
  770. MODE = -22
  771. C
  772. C Rescale and translate variables.
  773. C
  774. IGOPR = 1
  775. GO TO 130
  776. ENDIF
  777. C
  778. C Find a variable to become non-active.
  779. C T
  780. C Compute (negative) of gradient vector, W = E *(F-E*X).
  781. C
  782. CALL DCOPY(NCOLS,ZERO,0,WW,1)
  783. DO 200 J = NSETB+1,NCOLS
  784. JCOL = ABS(IBASIS(J))
  785. WW(J) = DDOT(MROWS-NSETB,W(INEXT(NSETB),J),1,
  786. * W(INEXT(NSETB),NCOLS+1),1)*ABS(SCL(JCOL))
  787. 200 CONTINUE
  788. C
  789. IF (IPRINT.GT.0) THEN
  790. CALL DVOUT(NCOLS,WW,'('' GRADIENT VALUES'')',-4)
  791. CALL IVOUT(NCOLS,IBASIS,'('' INTERNAL VARIABLE ORDER'')',-4)
  792. CALL IVOUT(NCOLS,IBB,'('' BOUND POLARITY'')',-4)
  793. ENDIF
  794. C
  795. C If active set = number of total rows, quit.
  796. C
  797. 210 IF (NSETB.EQ.MROWS) THEN
  798. FOUND = .FALSE.
  799. GO TO 120
  800. ENDIF
  801. C
  802. C Choose an extremal component of gradient vector for a candidate
  803. C to become non-active.
  804. C
  805. WLARGE = -BIG
  806. WMAG = -BIG
  807. DO 220 J = NSETB+1,NCOLS
  808. T = WW(J)
  809. IF (T.EQ.BIG) GO TO 220
  810. ITEMP = IBASIS(J)
  811. JCOL = ABS(ITEMP)
  812. T1 = DNRM2(MVAL-NSETB,W(INEXT(NSETB),J),1)
  813. IF (ITEMP.LT.0) THEN
  814. IF (MOD(IBB(JCOL),2).EQ.0) T = -T
  815. IF (T.LT.ZERO) GO TO 220
  816. IF (MVAL.GT.NSETB) T = T1
  817. IF (T.GT.WLARGE) THEN
  818. WLARGE = T
  819. JLARGE = J
  820. ENDIF
  821. ELSE
  822. IF (MVAL.GT.NSETB) T = T1
  823. IF (ABS(T).GT.WMAG) THEN
  824. WMAG = ABS(T)
  825. JMAG = J
  826. ENDIF
  827. ENDIF
  828. 220 CONTINUE
  829. C
  830. C Choose magnitude of largest component of gradient for candidate.
  831. C
  832. JBIG = 0
  833. WBIG = ZERO
  834. IF (WLARGE.GT.ZERO) THEN
  835. JBIG = JLARGE
  836. WBIG = WLARGE
  837. ENDIF
  838. C
  839. IF (WMAG.GE.WBIG) THEN
  840. JBIG = JMAG
  841. WBIG = WMAG
  842. ENDIF
  843. C
  844. IF (JBIG.EQ.0) THEN
  845. FOUND = .FALSE.
  846. IF (IPRINT.GT.0) THEN
  847. CALL IVOUT(0,I,'('' FOUND NO VARIABLE TO ENTER'')',-4)
  848. ENDIF
  849. GO TO 120
  850. ENDIF
  851. C
  852. C See if the incoming column is sufficiently independent. This
  853. C test is made before an elimination is performed.
  854. C
  855. IF (IPRINT.GT.0)
  856. * CALL IVOUT(1,JBIG,'('' TRY TO BRING IN THIS COL.'')',-4)
  857. C
  858. IF (MVAL.LE.NSETB) THEN
  859. CL1 = DNRM2(MVAL,W(1,JBIG),1)
  860. CL2 = ABS(WT)*DNRM2(NSETB-MVAL,W(INEXT(MVAL),JBIG),1)
  861. CL3 = ABS(WT)*DNRM2(MROWS-NSETB,W(INEXT(NSETB),JBIG),1)
  862. CALL DROTG(CL1,CL2,SC,SS)
  863. COLABV = ABS(CL1)
  864. COLBLO = CL3
  865. ELSE
  866. CL1 = DNRM2(NSETB,W(1,JBIG),1)
  867. CL2 = DNRM2(MVAL-NSETB,W(INEXT(NSETB),JBIG),1)
  868. CL3 = ABS(WT)*DNRM2(MROWS-MVAL,W(INEXT(MVAL),JBIG),1)
  869. COLABV = CL1
  870. CALL DROTG(CL2,CL3,SC,SS)
  871. COLBLO = ABS(CL2)
  872. ENDIF
  873. C
  874. IF (COLBLO.LE.TOLIND*COLABV) THEN
  875. WW(JBIG) = BIG
  876. IF (IPRINT.GT.0)
  877. * CALL IVOUT(0,I,'('' VARIABLE IS DEPENDENT, NOT USED.'')',
  878. * -4)
  879. GO TO 210
  880. ENDIF
  881. C
  882. C Swap matrix columns NSETB+1 and JBIG, plus pointer information,
  883. C and gradient values.
  884. C
  885. NSETB = NSETB + 1
  886. IF (NSETB.NE.JBIG) THEN
  887. CALL DSWAP(MROWS,W(1,NSETB),1,W(1,JBIG),1)
  888. CALL DSWAP(1,WW(NSETB),1,WW(JBIG),1)
  889. ITEMP = IBASIS(NSETB)
  890. IBASIS(NSETB) = IBASIS(JBIG)
  891. IBASIS(JBIG) = ITEMP
  892. ENDIF
  893. C
  894. C Eliminate entries below the pivot line in column NSETB.
  895. C
  896. IF (MROWS.GT.NSETB) THEN
  897. DO 230 I = MROWS,NSETB+1,-1
  898. IF (I.EQ.MVAL+1) GO TO 230
  899. CALL DROTG(W(I-1,NSETB),W(I,NSETB),SC,SS)
  900. W(I,NSETB) = ZERO
  901. CALL DROT(NCOLS-NSETB+1,W(I-1,NSETB+1),MDW,W(I,NSETB+1),
  902. * MDW,SC,SS)
  903. 230 CONTINUE
  904. C
  905. IF (MVAL.GE.NSETB .AND. MVAL.LT.MROWS) THEN
  906. CALL DROTG(W(NSETB,NSETB),W(MVAL+1,NSETB),SC,SS)
  907. W(MVAL+1,NSETB) = ZERO
  908. CALL DROT(NCOLS-NSETB+1,W(NSETB,NSETB+1),MDW,
  909. * W(MVAL+1,NSETB+1),MDW,SC,SS)
  910. ENDIF
  911. ENDIF
  912. C
  913. IF (W(NSETB,NSETB).EQ.ZERO) THEN
  914. WW(NSETB) = BIG
  915. NSETB = NSETB - 1
  916. IF (IPRINT.GT.0) THEN
  917. CALL IVOUT(0,I,'('' PIVOT IS ZERO, NOT USED.'')',-4)
  918. ENDIF
  919. GO TO 210
  920. ENDIF
  921. C
  922. C Check that new variable is moving in the right direction.
  923. C
  924. ITEMP = IBASIS(NSETB)
  925. JCOL = ABS(ITEMP)
  926. XNEW = (W(NSETB,NCOLS+1)/W(NSETB,NSETB))/ABS(SCL(JCOL))
  927. IF (ITEMP.LT.0) THEN
  928. C
  929. C IF(WW(NSETB).GE.ZERO.AND.XNEW.LE.ZERO) exit(quit)
  930. C IF(WW(NSETB).LE.ZERO.AND.XNEW.GE.ZERO) exit(quit)
  931. C
  932. IF ((WW(NSETB).GE.ZERO.AND.XNEW.LE.ZERO) .OR.
  933. * (WW(NSETB).LE.ZERO.AND.XNEW.GE.ZERO)) GO TO 240
  934. ENDIF
  935. FOUND = .TRUE.
  936. GO TO 120
  937. C
  938. 240 WW(NSETB) = BIG
  939. NSETB = NSETB - 1
  940. IF (IPRINT.GT.0)
  941. * CALL IVOUT(0,I,'('' VARIABLE HAS BAD DIRECTION, NOT USED.'')',
  942. * -4)
  943. GO TO 210
  944. C
  945. C Solve the triangular system.
  946. C
  947. 270 CALL DCOPY(NSETB,W(1,NCOLS+1),1,RW,1)
  948. DO 280 J = NSETB,1,-1
  949. RW(J) = RW(J)/W(J,J)
  950. JCOL = ABS(IBASIS(J))
  951. T = RW(J)
  952. IF (MOD(IBB(JCOL),2).EQ.0) RW(J) = -RW(J)
  953. CALL DAXPY(J-1,-T,W(1,J),1,RW,1)
  954. RW(J) = RW(J)/ABS(SCL(JCOL))
  955. 280 CONTINUE
  956. C
  957. IF (IPRINT.GT.0) THEN
  958. CALL DVOUT(NSETB,RW,'('' SOLN. VALUES'')',-4)
  959. CALL IVOUT(NSETB,IBASIS,'('' COLS. USED'')',-4)
  960. ENDIF
  961. C
  962. IF (LGOPR.EQ.2) THEN
  963. CALL DCOPY(NSETB,RW,1,X,1)
  964. DO 450 J = 1,NSETB
  965. ITEMP = IBASIS(J)
  966. JCOL = ABS(ITEMP)
  967. IF (ITEMP.LT.0) THEN
  968. BOU = ZERO
  969. ELSE
  970. BOU = BL(JCOL)
  971. ENDIF
  972. C
  973. IF ((-BOU).NE.BIG) BOU = BOU/ABS(SCL(JCOL))
  974. IF (X(J).LE.BOU) THEN
  975. JDROP1 = J
  976. GO TO 340
  977. ENDIF
  978. C
  979. BOU = BU(JCOL)
  980. IF (BOU.NE.BIG) BOU = BOU/ABS(SCL(JCOL))
  981. IF (X(J).GE.BOU) THEN
  982. JDROP2 = J
  983. GO TO 340
  984. ENDIF
  985. 450 CONTINUE
  986. GO TO 340
  987. ENDIF
  988. C
  989. C See if the unconstrained solution (obtained by solving the
  990. C triangular system) satisfies the problem bounds.
  991. C
  992. ALPHA = TWO
  993. BETA = TWO
  994. X(NSETB) = ZERO
  995. DO 310 J = 1,NSETB
  996. ITEMP = IBASIS(J)
  997. JCOL = ABS(ITEMP)
  998. T1 = TWO
  999. T2 = TWO
  1000. IF (ITEMP.LT.0) THEN
  1001. BOU = ZERO
  1002. ELSE
  1003. BOU = BL(JCOL)
  1004. ENDIF
  1005. IF ((-BOU).NE.BIG) BOU = BOU/ABS(SCL(JCOL))
  1006. IF (RW(J).LE.BOU) T1 = (X(J)-BOU)/ (X(J)-RW(J))
  1007. BOU = BU(JCOL)
  1008. IF (BOU.NE.BIG) BOU = BOU/ABS(SCL(JCOL))
  1009. IF (RW(J).GE.BOU) T2 = (BOU-X(J))/ (RW(J)-X(J))
  1010. C
  1011. C If not, then compute a step length so that the variables remain
  1012. C feasible.
  1013. C
  1014. IF (T1.LT.ALPHA) THEN
  1015. ALPHA = T1
  1016. JDROP1 = J
  1017. ENDIF
  1018. C
  1019. IF (T2.LT.BETA) THEN
  1020. BETA = T2
  1021. JDROP2 = J
  1022. ENDIF
  1023. 310 CONTINUE
  1024. C
  1025. CONSTR = ALPHA .LT. TWO .OR. BETA .LT. TWO
  1026. IF (.NOT.CONSTR) THEN
  1027. C
  1028. C Accept the candidate because it satisfies the stated bounds
  1029. C on the variables.
  1030. C
  1031. CALL DCOPY(NSETB,RW,1,X,1)
  1032. GO TO 580
  1033. ENDIF
  1034. C
  1035. C Take a step that is as large as possible with all variables
  1036. C remaining feasible.
  1037. C
  1038. DO 330 J = 1,NSETB
  1039. X(J) = X(J) + MIN(ALPHA,BETA)* (RW(J)-X(J))
  1040. 330 CONTINUE
  1041. C
  1042. IF (ALPHA.LE.BETA) THEN
  1043. JDROP2 = 0
  1044. ELSE
  1045. JDROP1 = 0
  1046. ENDIF
  1047. C
  1048. 340 IF (JDROP1+JDROP2.LE.0 .OR. NSETB.LE.0) GO TO 580
  1049. 350 JDROP = JDROP1 + JDROP2
  1050. ITEMP = IBASIS(JDROP)
  1051. JCOL = ABS(ITEMP)
  1052. IF (JDROP2.GT.0) THEN
  1053. C
  1054. C Variable is at an upper bound. Subtract multiple of this
  1055. C column from right hand side.
  1056. C
  1057. T = BU(JCOL)
  1058. IF (ITEMP.GT.0) THEN
  1059. BU(JCOL) = T - BL(JCOL)
  1060. BL(JCOL) = -T
  1061. ITEMP = -ITEMP
  1062. SCL(JCOL) = -SCL(JCOL)
  1063. DO 360 I = 1,JDROP
  1064. W(I,JDROP) = -W(I,JDROP)
  1065. 360 CONTINUE
  1066. ELSE
  1067. IBB(JCOL) = IBB(JCOL) + 1
  1068. IF (MOD(IBB(JCOL),2).EQ.0) T = -T
  1069. ENDIF
  1070. C
  1071. C Variable is at a lower bound.
  1072. C
  1073. ELSE
  1074. IF (ITEMP.LT.ZERO) THEN
  1075. T = ZERO
  1076. ELSE
  1077. T = -BL(JCOL)
  1078. BU(JCOL) = BU(JCOL) + T
  1079. ITEMP = -ITEMP
  1080. ENDIF
  1081. ENDIF
  1082. C
  1083. CALL DAXPY(JDROP,T,W(1,JDROP),1,W(1,NCOLS+1),1)
  1084. C
  1085. C Move certain columns left to achieve upper Hessenberg form.
  1086. C
  1087. CALL DCOPY(JDROP,W(1,JDROP),1,RW,1)
  1088. DO 370 J = JDROP+1,NSETB
  1089. IBASIS(J-1) = IBASIS(J)
  1090. X(J-1) = X(J)
  1091. CALL DCOPY(J,W(1,J),1,W(1,J-1),1)
  1092. 370 CONTINUE
  1093. C
  1094. IBASIS(NSETB) = ITEMP
  1095. W(1,NSETB) = ZERO
  1096. CALL DCOPY(MROWS-JDROP,W(1,NSETB),0,W(JDROP+1,NSETB),1)
  1097. CALL DCOPY(JDROP,RW,1,W(1,NSETB),1)
  1098. C
  1099. C Transform the matrix from upper Hessenberg form to upper
  1100. C triangular form.
  1101. C
  1102. NSETB = NSETB - 1
  1103. DO 390 I = JDROP,NSETB
  1104. C
  1105. C Look for small pivots and avoid mixing weighted and
  1106. C nonweighted rows.
  1107. C
  1108. IF (I.EQ.MVAL) THEN
  1109. T = ZERO
  1110. DO 380 J = I,NSETB
  1111. JCOL = ABS(IBASIS(J))
  1112. T1 = ABS(W(I,J)*SCL(JCOL))
  1113. IF (T1.GT.T) THEN
  1114. JBIG = J
  1115. T = T1
  1116. ENDIF
  1117. 380 CONTINUE
  1118. GO TO 400
  1119. ENDIF
  1120. CALL DROTG(W(I,I),W(I+1,I),SC,SS)
  1121. W(I+1,I) = ZERO
  1122. CALL DROT(NCOLS-I+1,W(I,I+1),MDW,W(I+1,I+1),MDW,SC,SS)
  1123. 390 CONTINUE
  1124. GO TO 430
  1125. C
  1126. C The triangularization is completed by giving up the Hessenberg
  1127. C form and triangularizing a rectangular matrix.
  1128. C
  1129. 400 CALL DSWAP(MROWS,W(1,I),1,W(1,JBIG),1)
  1130. CALL DSWAP(1,WW(I),1,WW(JBIG),1)
  1131. CALL DSWAP(1,X(I),1,X(JBIG),1)
  1132. ITEMP = IBASIS(I)
  1133. IBASIS(I) = IBASIS(JBIG)
  1134. IBASIS(JBIG) = ITEMP
  1135. JBIG = I
  1136. DO 420 J = JBIG,NSETB
  1137. DO 410 I = J+1,MROWS
  1138. CALL DROTG(W(J,J),W(I,J),SC,SS)
  1139. W(I,J) = ZERO
  1140. CALL DROT(NCOLS-J+1,W(J,J+1),MDW,W(I,J+1),MDW,SC,SS)
  1141. 410 CONTINUE
  1142. 420 CONTINUE
  1143. C
  1144. C See if the remaining coefficients are feasible. They should be
  1145. C because of the way MIN(ALPHA,BETA) was chosen. Any that are not
  1146. C feasible will be set to their bounds and appropriately translated.
  1147. C
  1148. 430 JDROP1 = 0
  1149. JDROP2 = 0
  1150. LGOPR = 2
  1151. GO TO 270
  1152. C
  1153. C Find a variable to become non-active.
  1154. C
  1155. 120 IF (FOUND) THEN
  1156. LGOPR = 1
  1157. GO TO 270
  1158. ENDIF
  1159. C
  1160. C Rescale and translate variables.
  1161. C
  1162. IGOPR = 2
  1163. 130 CALL DCOPY(NSETB,X,1,RW,1)
  1164. CALL DCOPY(NCOLS,ZERO,0,X,1)
  1165. DO 140 J = 1,NSETB
  1166. JCOL = ABS(IBASIS(J))
  1167. X(JCOL) = RW(J)*ABS(SCL(JCOL))
  1168. 140 CONTINUE
  1169. C
  1170. DO 150 J = 1,NCOLS
  1171. IF (MOD(IBB(J),2).EQ.0) X(J) = BU(J) - X(J)
  1172. 150 CONTINUE
  1173. C
  1174. DO 160 J = 1,NCOLS
  1175. JCOL = IBASIS(J)
  1176. IF (JCOL.LT.0) X(-JCOL) = BL(-JCOL) + X(-JCOL)
  1177. 160 CONTINUE
  1178. C
  1179. DO 170 J = 1,NCOLS
  1180. IF (SCL(J).LT.ZERO) X(J) = -X(J)
  1181. 170 CONTINUE
  1182. C
  1183. I = MAX(NSETB,MVAL)
  1184. RNORM = DNRM2(MROWS-I,W(INEXT(I),NCOLS+1),1)
  1185. C
  1186. IF (IGOPR.EQ.2) MODE = NSETB
  1187. RETURN
  1188. END