1 |
************************************************************************ |
2 |
* |
3 |
* File mi20amat fortran. |
4 |
* |
5 |
* m2core m2amat m2aprd m2apr1 m2apr5 |
6 |
* m2crsh m2scal m2scla m2unpk matcol |
7 |
* |
8 |
*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
9 |
|
10 |
subroutine m2core( mode, mincor ) |
11 |
|
12 |
implicit double precision (a-h,o-z) |
13 |
|
14 |
* ------------------------------------------------------------------ |
15 |
* m2core allocates all array storage for MINOS, |
16 |
* using various dimensions stored in common blocks as follows: |
17 |
* (m2len ) mrows, mcols, melms |
18 |
* (m3len ) nscl |
19 |
* (m5len ) maxr, maxs, nn |
20 |
* (m7len ) nnobj |
21 |
* (m8len ) njac, nncon, nnjac |
22 |
* |
23 |
* if mode = 1, the call is from minos1 to estimate the storage |
24 |
* needed for all stages of the problem. |
25 |
* if mode = 2, the call is from m3inpt to find the minimum storage |
26 |
* needed for mps input. |
27 |
* if mode = 3, all dimensions should be known exactly. |
28 |
* The call is from m3inpt to find the minimum |
29 |
* storage to solve the problem and output the solution. |
30 |
* The basis factorization routines will say later |
31 |
* if they have sufficient storage. |
32 |
* if mode = 4, the call is from minoss and all dimensions are known |
33 |
* exactly. a, ha, ka etc need not be allocated. |
34 |
* ------------------------------------------------------------------ |
35 |
|
36 |
common /m1word/ nwordr,nwordi,nwordh |
37 |
common /m2len / mrows,mcols,melms |
38 |
common /m2mapa/ ne ,nka ,la ,lha ,lka |
39 |
common /m2mapz/ maxw ,maxz |
40 |
common /m3len / m ,n ,nb ,nscl |
41 |
common /m3loc / lascal,lbl ,lbu ,lbbl ,lbbu , |
42 |
$ lhrtyp,lhs ,lkb |
43 |
common /m3mps1/ lname1,lname2,lkeynm,nname |
44 |
common /m3scal/ sclobj,scltol,lscale |
45 |
common /m5len / maxr ,maxs ,mbs ,nn ,nn0 ,nr ,nx |
46 |
common /m5loc / lpi ,lpi2 ,lw ,lw2 , |
47 |
$ lx ,lx2 ,ly ,ly2 , |
48 |
$ lgsub ,lgsub2,lgrd ,lgrd2 , |
49 |
$ lr ,lrg ,lrg2 ,lxn |
50 |
common /m7len / fobj ,fobj2 ,nnobj ,nnobj0 |
51 |
common /m7loc / lgobj ,lgobj2 |
52 |
common /m7cg2 / lcg1,lcg2,lcg3,lcg4,modtcg,nitncg,nsubsp |
53 |
common /m8len / njac ,nncon ,nncon0,nnjac |
54 |
common /m8loc / lfcon ,lfcon2,lfdif ,lfdif2,lfold , |
55 |
$ lblslk,lbuslk,lxlam ,lrhs , |
56 |
$ lgcon ,lgcon2,lxdif ,lxold |
57 |
common /m8al1 / penpar,rowtol,ncom,nden,nlag,nmajor,nminor |
58 |
* ------------------------------------------------------------------ |
59 |
|
60 |
m = mrows |
61 |
n = mcols |
62 |
ne = melms |
63 |
mbs = m + maxs |
64 |
nka = n + 1 |
65 |
nb = n + m |
66 |
nscl = nb |
67 |
if (lscale .eq. 0) nscl = 1 |
68 |
nname = nb |
69 |
if (mode .eq. 4) nname = 1 |
70 |
|
71 |
ncoli = n/nwordi + 1 |
72 |
nrowi = m/nwordi + 1 |
73 |
lenh = max( 3*nrowi, 100 ) |
74 |
|
75 |
nn0 = max( nn , 1 ) |
76 |
nncon0 = max( nncon, 1 ) |
77 |
nnobj0 = max( nnobj, 1 ) |
78 |
maxr = max( maxr , 1 ) |
79 |
nr = maxr*(maxr + 1)/2 + (maxs - maxr) |
80 |
nx = max( mbs, nn ) |
81 |
nx2 = 0 |
82 |
if (lscale .ge. 2) nx2 = nn |
83 |
|
84 |
if (mode .le. 3) then |
85 |
|
86 |
* MINOS is getting its data from an MPS file. |
87 |
* Allocate arrays that are arguments of minoss and misolv. |
88 |
* These are for the data, |
89 |
* A, ha, ka, bl, bu, name1, name2, |
90 |
* and for the solution |
91 |
* hs, xn, pi, rc. |
92 |
|
93 |
la = maxw + 1 |
94 |
lha = la + ne |
95 |
lka = lha + 1 + (ne /nwordh) |
96 |
lbl = lka + 1 + (nka/nwordi) |
97 |
lbu = lbl + nb |
98 |
lname1 = lbu + nb |
99 |
lname2 = lname1 + 1 + (nname/nwordi) |
100 |
lhs = lname2 + 1 + (nname/nwordi) |
101 |
lxn = lhs + 1 + (nb /nwordh) |
102 |
lpi = lxn + nb |
103 |
lrc = lpi + m |
104 |
minsub = lrc + nb |
105 |
else |
106 |
|
107 |
* The subroutine version can use all of z except up to maxw. |
108 |
|
109 |
minsub = maxw + 1 |
110 |
end if |
111 |
|
112 |
* Allocate arrays needed during and after MPS input. |
113 |
|
114 |
lhrtyp = minsub |
115 |
lkb = lhrtyp + 1 + (mbs/nwordh) |
116 |
minz = lkb + 1 + (mbs/nwordi) |
117 |
|
118 |
if (mode .le. 2) then |
119 |
|
120 |
* Allocate additional arrays needed for MPS input. |
121 |
* Currently just keynam -- the hash table. |
122 |
|
123 |
lkeynm = minz |
124 |
minmps = lkeynm + lenh |
125 |
end if |
126 |
|
127 |
* LP and reduced-gradient algorithm. |
128 |
***** Beware -- length 0000 is used below for arrays that are |
129 |
***** not needed in this version of MINOS. |
130 |
|
131 |
lascal = minz |
132 |
lpi2 = lascal + nscl |
133 |
lw = lpi2 + 0000 |
134 |
lw2 = lw + nx |
135 |
lx = lw2 + 0000 |
136 |
lx2 = lx + nx |
137 |
ly = lx2 + nx2 |
138 |
ly2 = ly + nx |
139 |
lgsub = ly2 + nx |
140 |
lgsub2 = lgsub + nn |
141 |
lgrd = lgsub2 + 0000 |
142 |
lr = lgrd + mbs |
143 |
lrg = lr + nr |
144 |
lrg2 = lrg + maxs |
145 |
minz = lrg2 + maxs |
146 |
|
147 |
* Nonlinear objective. |
148 |
|
149 |
lgobj = minz |
150 |
lgobj2 = lgobj + nnobj |
151 |
minz = lgobj2 + nnobj |
152 |
|
153 |
* Nonlinear constraints. |
154 |
* If Jacobian = Dense we can set njac correctly. |
155 |
* Otherwise we have to guess if the MPS file hasn't been |
156 |
* input yet (mode = 1 or 2). |
157 |
|
158 |
if (nden .eq. 1) then |
159 |
njac = nncon * nnjac |
160 |
else if (mode .le. 2) then |
161 |
njac = 5 * nnjac |
162 |
end if |
163 |
njac = max( njac, 1 ) |
164 |
lfcon = minz |
165 |
lfcon2 = lfcon + nncon |
166 |
lfdif = lfcon2 + nncon |
167 |
lfdif2 = lfdif + nncon |
168 |
lfold = lfdif2 + 0000 |
169 |
lblslk = lfold + nncon |
170 |
lbuslk = lblslk + nncon |
171 |
lxlam = lbuslk + nncon |
172 |
lrhs = lxlam + nncon |
173 |
lgcon = lrhs + nncon |
174 |
lgcon2 = lgcon + njac |
175 |
lxdif = lgcon2 + njac |
176 |
lxold = lxdif + nn |
177 |
minz = lxold + nn |
178 |
|
179 |
* Work arrays that can be overwritten by the names (see below) |
180 |
* in between cycles. |
181 |
|
182 |
lbbl = minz |
183 |
lbbu = lbbl + mbs |
184 |
lgrd2 = lbbu + mbs |
185 |
minz = lgrd2 + mbs |
186 |
|
187 |
* Allocate arrays for the basis factorization routines. |
188 |
* minz points to the beginning of the LU factorization. |
189 |
* This is the beginning of free space between cycles |
190 |
* if the LU factors are allowed to be overwritten. |
191 |
|
192 |
call m2bmap( mode, m, n, ne, minz, maxz, nguess ) |
193 |
|
194 |
if (mode .eq. 1) mincor = max( minmps, nguess, minz ) |
195 |
if (mode .eq. 2) mincor = minmps |
196 |
if (mode .ge. 3) mincor = minz |
197 |
|
198 |
* end of m2core |
199 |
end |
200 |
|
201 |
*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
202 |
|
203 |
subroutine m2amat( mode, m, n, nb, |
204 |
$ ne, nka, a, ha, ka, |
205 |
$ bl, bu, hrtype ) |
206 |
|
207 |
implicit double precision (a-h,o-z) |
208 |
integer*4 ha(ne), hrtype(m) |
209 |
integer ka(nka) |
210 |
double precision a(ne), bl(nb), bu(nb) |
211 |
|
212 |
* ------------------------------------------------------------------ |
213 |
* If mode = 1 or 2, m2amat defines hrtype, the set of row types. |
214 |
* If mode = 1, m2amat also prints the matrix statistics. |
215 |
* |
216 |
* The vector of row-types is as follows: |
217 |
* hrtype(i) = 0 for e rows (equalities), |
218 |
* hrtype(i) = 2 for n rows (objective or free rows), |
219 |
* hrtype(i) = 1 otherwise. |
220 |
* They are used in m2scal and m2crsh. |
221 |
* ------------------------------------------------------------------ |
222 |
|
223 |
common /m1eps / eps,eps0,eps1,eps2,eps3,eps4,eps5,plinfy |
224 |
common /m1file/ iread,iprint,isumm |
225 |
common /m5lobj/ sinf,wtobj,minimz,ninf,iobj,jobj,kobj |
226 |
common /m8len / njac ,nncon ,nncon0,nnjac |
227 |
|
228 |
intrinsic abs, max, min |
229 |
parameter ( zero = 0.0d+0 ) |
230 |
|
231 |
bplus = 0.9*plinfy |
232 |
bminus = - bplus |
233 |
|
234 |
* Construct the vector of row-types. |
235 |
|
236 |
nfixed = 0 |
237 |
nfree = 0 |
238 |
nnorml = 0 |
239 |
do 100 i = 1, m |
240 |
j = n + i |
241 |
b1 = bl(j) |
242 |
b2 = bu(j) |
243 |
itype = 1 |
244 |
if (b1 .eq. b2 ) itype = 0 |
245 |
if (b1 .le. bminus .and. b2 .ge. bplus) itype = 2 |
246 |
hrtype(i) = itype |
247 |
if (itype .eq. 0) nfixed = nfixed + 1 |
248 |
if (itype .eq. 2) nfree = nfree + 1 |
249 |
if (itype .ne. 1) go to 100 |
250 |
if (b1 .le. bminus .or. b2 .ge. bplus) nnorml = nnorml + 1 |
251 |
100 continue |
252 |
|
253 |
if (mode .eq. 2) return |
254 |
if (iprint .le. 0) return |
255 |
|
256 |
nbnded = m - nfixed - nfree - nnorml |
257 |
write(iprint, 2200) |
258 |
write(iprint, 2300) ' Rows ', m, nnorml, nfree, nfixed, nbnded |
259 |
|
260 |
nfixed = 0 |
261 |
nfree = 0 |
262 |
nnorml = 0 |
263 |
|
264 |
do 200 j = 1, n |
265 |
b1 = bl(j) |
266 |
b2 = bu(j) |
267 |
if (b1 .eq. b2) then |
268 |
nfixed = nfixed + 1 |
269 |
else |
270 |
if (b1 .eq. zero ) then |
271 |
if (b2 .ge. bplus) then |
272 |
nnorml = nnorml + 1 |
273 |
end if |
274 |
else if (b1 .le. bminus) then |
275 |
if (b2 .eq. zero ) then |
276 |
nnorml = nnorml + 1 |
277 |
else if (b2 .ge. bplus) then |
278 |
nfree = nfree + 1 |
279 |
end if |
280 |
end if |
281 |
end if |
282 |
200 continue |
283 |
|
284 |
nbnded = n - nfixed - nfree - nnorml |
285 |
write(iprint, 2300) ' Columns', n, nnorml, nfree, nfixed, nbnded |
286 |
|
287 |
* Find the biggest and smallest elements in a, excluding free rows |
288 |
* and fixed columns. |
289 |
* Also find the largest objective coefficients in non-fixed columns. |
290 |
|
291 |
aijmax = zero |
292 |
aijmin = bplus |
293 |
cmax = zero |
294 |
cmin = bplus |
295 |
ncost = 0 |
296 |
|
297 |
do 300 j = 1, n |
298 |
if (bl(j) .lt. bu(j)) then |
299 |
do 250 k = ka(j), ka(j+1) - 1 |
300 |
i = ha(k) |
301 |
if (hrtype(i) .eq. 2) then |
302 |
if (i .eq. iobj) then |
303 |
aij = abs( a(k) ) |
304 |
if (aij .gt. zero) then |
305 |
ncost = ncost + 1 |
306 |
cmax = max( cmax, aij ) |
307 |
cmin = min( cmin, aij ) |
308 |
end if |
309 |
end if |
310 |
else |
311 |
aij = abs( a(k) ) |
312 |
aijmax = max( aijmax, aij ) |
313 |
aijmin = min( aijmin, aij ) |
314 |
end if |
315 |
250 continue |
316 |
end if |
317 |
300 continue |
318 |
|
319 |
if (aijmin .eq. bplus) aijmin = zero |
320 |
adnsty = 100.0*ne / (m*n) |
321 |
write(iprint, 2400) ne, adnsty, aijmax, aijmin, ncost |
322 |
if (ncost .gt. 0) write(iprint, 2410) cmax, cmin |
323 |
|
324 |
* Print a few things to be gathered as statistics |
325 |
* from a bunch of test runs. |
326 |
|
327 |
write(iprint, 2500) nncon, m-nncon, n |
328 |
return |
329 |
|
330 |
2200 format(/// |
331 |
$ ' Matrix Statistics' / |
332 |
$ ' -----------------' / |
333 |
$ 15x, 'Total', 6x, 'Normal', 8x, 'Free', 7x, 'Fixed', |
334 |
$ 5x, 'Bounded') |
335 |
2300 format(a, 5i12) |
336 |
2400 format(/ ' No. of matrix elements', i21, 5x, 'Density', f12.3 |
337 |
$ / ' Biggest ', 1p, e35.4, ' (excluding fixed columns,' |
338 |
$ / ' Smallest', e35.4, ' free rows, and RHS)' |
339 |
$ // ' No. of objective coefficients', i14) |
340 |
2410 format( ' Biggest ', 1p, e35.4, ' (excluding fixed columns)' |
341 |
$ / ' Smallest', e35.4) |
342 |
2500 format(//' Number of Nonlinear constraints', i12 |
343 |
$ / ' Number of Linear constraints', i12 |
344 |
$ / ' Number of Variables ', i12) |
345 |
|
346 |
* end of m2amat |
347 |
end |
348 |
|
349 |
*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
350 |
|
351 |
subroutine m2aprd( mode, x, lenx, y, leny, |
352 |
$ ne, nka, a, ha, ka, |
353 |
$ z, nwcore ) |
354 |
|
355 |
implicit double precision (a-h,o-z) |
356 |
integer*4 ha(ne) |
357 |
integer ka(nka) |
358 |
double precision a(ne) |
359 |
double precision x(lenx), y(leny), z(nwcore) |
360 |
|
361 |
* ------------------------------------------------------------------ |
362 |
* m2aprd computes various products involving the matrix A. |
363 |
* For mode 1 to 4, x is the basic and/or superbasic variables. |
364 |
* For mode 5 to 8, x is xn, the variables in natural order. |
365 |
* |
366 |
* mode function lenx leny called by |
367 |
* ---- -------- ---- ---- --------- |
368 |
* 1 y = y - B*x m m not used |
369 |
* 1 y = y - (B S)*x ms m not used |
370 |
* 2 y = y - S*x ns m m7rgit |
371 |
* 3 y = y - B(t)*x m m not used |
372 |
* 3 y = y - (B S)(t)*x m ms not used |
373 |
* 4 y = y - S(t)*x m ms m7chzq, m7rg |
374 |
* |
375 |
* 5 y = y - A*xn n m m5setx, m5solv |
376 |
* 6 not used |
377 |
* 7 y = y - (nonlinear A)*xn nnjac nncon m6fun1, m8setj |
378 |
* 8 y = y - (linear A)*xn n nncon m8viol |
379 |
* mode 7 and 8 deal with nonlinear rows only and ignore slacks. |
380 |
* |
381 |
* 14 Oct 1991: a, ha, ka added as parameters to help with minoss. |
382 |
* ------------------------------------------------------------------ |
383 |
|
384 |
common /m1eps / eps,eps0,eps1,eps2,eps3,eps4,eps5,plinfy |
385 |
common /m3len / m ,n ,nb ,nscl |
386 |
common /m3loc / lascal,lbl ,lbu ,lbbl ,lbbu , |
387 |
$ lhrtyp,lhs ,lkb |
388 |
common /m5len / maxr ,maxs ,mbs ,nn ,nn0 ,nr ,nx |
389 |
common /m8len / njac ,nncon ,nncon0,nnjac |
390 |
|
391 |
tolz = eps0 |
392 |
|
393 |
if (mode .lt. 5) then |
394 |
call m2apr1( mode, m, mbs, n, tolz, |
395 |
$ ne, nka, a, ha, ka, z(lkb), |
396 |
$ x, lenx, y, leny ) |
397 |
else |
398 |
call m2apr5( mode, m, n, nb, nncon, nnjac, tolz, |
399 |
$ ne, nka, a, ha, ka, |
400 |
$ x, lenx, y, leny ) |
401 |
end if |
402 |
|
403 |
* end of m2aprd |
404 |
end |
405 |
|
406 |
*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
407 |
|
408 |
subroutine m2apr1( mode, m, mbs, n, tolz, |
409 |
$ ne, nka, a, ha, ka, kb, x, lenx, y, leny ) |
410 |
|
411 |
implicit double precision (a-h,o-z) |
412 |
integer*4 ha(ne) |
413 |
integer ka(nka), kb(mbs) |
414 |
double precision a(ne) |
415 |
double precision x(lenx), y(leny) |
416 |
|
417 |
* ------------------------------------------------------------------ |
418 |
* m2apr1 computes various matrix-vector products involving |
419 |
* B and S, the basic and superbasic columns of A. |
420 |
* |
421 |
* mode=1 y = y - B*x or y - (B S)*x (depending on lenx) |
422 |
* mode=2 y = y - S*x |
423 |
* mode=3 y = y - B(transpose)*x or y - (B S)(transpose)*x |
424 |
* (mode 3 is not used as yet) |
425 |
* mode=4 y = y - S(transpose)*x |
426 |
* ------------------------------------------------------------------ |
427 |
|
428 |
kbase = 0 |
429 |
if (mode .le. 2) then |
430 |
* ------------- |
431 |
* mode 1 and 2. |
432 |
* ------------- |
433 |
if (mode .eq. 2) kbase = m |
434 |
|
435 |
do 200 k = 1, lenx |
436 |
xj = x(k) |
437 |
if (abs(xj) .le. tolz) go to 200 |
438 |
j = kb(kbase + k) |
439 |
if (j .le. n) then |
440 |
do 150 i = ka(j), ka(j+1) - 1 |
441 |
ir = ha(i) |
442 |
y(ir) = y(ir) - a(i)*xj |
443 |
150 continue |
444 |
else |
445 |
ir = j - n |
446 |
y(ir) = y(ir) - xj |
447 |
end if |
448 |
200 continue |
449 |
else |
450 |
* ------------- |
451 |
* mode 3 and 4. |
452 |
* ------------- |
453 |
if (mode .eq. 4) kbase = m |
454 |
|
455 |
do 400 k = 1, leny |
456 |
t = y(k) |
457 |
j = kb(kbase + k) |
458 |
if (j .le. n) then |
459 |
do 350 i = ka(j), ka(j+1) - 1 |
460 |
ir = ha(i) |
461 |
t = t - x(ir)*a(i) |
462 |
350 continue |
463 |
y(k) = t |
464 |
else |
465 |
ir = j - n |
466 |
y(k) = t - x(ir) |
467 |
end if |
468 |
400 continue |
469 |
end if |
470 |
|
471 |
* end of m2apr1 |
472 |
end |
473 |
|
474 |
*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
475 |
|
476 |
subroutine m2apr5( mode, m, n, nb, nncon, nnjac, tolz, |
477 |
$ ne, nka, a, ha, ka, xn, lenx, y, leny ) |
478 |
|
479 |
implicit double precision (a-h,o-z) |
480 |
integer*4 ha(ne) |
481 |
integer ka(nka) |
482 |
double precision a(ne) |
483 |
double precision xn(lenx), y(leny) |
484 |
|
485 |
* ------------------------------------------------------------------ |
486 |
* m2apr5 computes products involving parts of A and xn. |
487 |
* ------------------------------------------------------------------ |
488 |
|
489 |
intrinsic abs |
490 |
|
491 |
if (mode .eq. 5) then |
492 |
* ---------------------------------- |
493 |
* mode = 5. Set y = y - A*xn. |
494 |
* ---------------------------------- |
495 |
do 500 j = 1, n |
496 |
xj = xn(j) |
497 |
if (abs( xj ) .gt. tolz) then |
498 |
do 450 k = ka(j), ka(j+1) - 1 |
499 |
ir = ha(k) |
500 |
y(ir) = y(ir) - a(k)*xj |
501 |
450 continue |
502 |
end if |
503 |
500 continue |
504 |
|
505 |
else |
506 |
* ------------------------------------------------------------ |
507 |
* If mode = 7, set y = y - (Jacobian)*xn. |
508 |
* If mode = 8, set y = y - (linear A)*xn. |
509 |
* Only the first nncon rows are involved, and no slacks. |
510 |
* ------------------------------------------------------------ |
511 |
if (mode .eq. 7) then |
512 |
j1 = 1 |
513 |
j2 = nnjac |
514 |
else |
515 |
j1 = nnjac + 1 |
516 |
j2 = n |
517 |
end if |
518 |
|
519 |
do 800 j = j1, j2 |
520 |
xj = xn(j) |
521 |
if (abs( xj ) .gt. tolz) then |
522 |
do 750 k = ka(j), ka(j+1) - 1 |
523 |
ir = ha(k) |
524 |
if (ir .le. nncon) y(ir) = y(ir) - a(k)*xj |
525 |
750 continue |
526 |
end if |
527 |
800 continue |
528 |
end if |
529 |
|
530 |
* end of m2apr5 |
531 |
end |
532 |
|
533 |
*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
534 |
|
535 |
subroutine m2crsh( lcrash, m , n , nb , nn , |
536 |
$ ne , nka , a , ha , ka , |
537 |
$ hpiv , hs , hrtype, bl , bu , |
538 |
$ xn , z , nwcore ) |
539 |
|
540 |
implicit double precision (a-h,o-z) |
541 |
integer*4 ha(ne), hpiv(m), hs(nb), hrtype(m) |
542 |
integer ka(nka) |
543 |
double precision a(ne), bl(nb), bu(nb), xn(nb), z(nwcore ) |
544 |
|
545 |
* ------------------------------------------------------------------ |
546 |
* m2crsh looks for a basis in the columns of ( A I ). |
547 |
* |
548 |
* ON ENTRY |
549 |
* |
550 |
* iparm(1) = Crash option (icrash) has been used by m4getb |
551 |
* to set lcrash. |
552 |
* dparm(5) = Crash tolerance (tcrash). Default = 0.1 |
553 |
* |
554 |
* lcrash specifies the action to be taken by Crash. |
555 |
* 0,1,2,3 The call is from m4getb. |
556 |
* 4 The call is from m5solv. |
557 |
* 5 The call is from m8setj. |
558 |
* |
559 |
* 0 The all-slack basis is set up. |
560 |
* |
561 |
* 1 A triangular crash is applied to the columns of A. |
562 |
* hs(1:n) is used to help select columns. |
563 |
* tcrash is used to ignore small entries in each column. |
564 |
* Depending on the size of tcrash, the resulting basis |
565 |
* will be nearly (but not strictly) lower triangular. |
566 |
* |
567 |
* 2 As for 1, but nonlinear rows are ignored. |
568 |
* |
569 |
* 3 As for 2, but linear LG rows are also ignored. |
570 |
* |
571 |
* 4 Linear LG rows are now included. |
572 |
* All hs(1:nb) and xn(n+i) are defined. |
573 |
* Slack values of xn(n+i) are used to select LG rows. |
574 |
* |
575 |
* 5 Nonlinear rows are now included. |
576 |
* |
577 |
* hrtype(*) should be defined as described in m2amat: |
578 |
* hrtype(i) = 0 for E rows (equalities) |
579 |
* hrtype(i) = 1 for L or G rows (inequalities) |
580 |
* hrtype(i) = 2 for N rows (objective or free rows) |
581 |
* |
582 |
* xn If lcrash <= 4, xn(1:n) is used to initialize |
583 |
* slacks as xn(n+1:nb) = - A*xn. |
584 |
* Used to select slacks from LG rows to be in B (basis). |
585 |
* If lcrash = 5, xn(n+1:n+nncon) contains slack values |
586 |
* evaluated from xn(1:n) and fcon(*). |
587 |
* Used to select slacks from nonlinear rows to be in B. |
588 |
* |
589 |
* hs If lcrash = 1, 2 or 3, hs(1:n) is used. |
590 |
* If lcrash = 4 or 5, hs(1:nb) is used. |
591 |
* If hs(j) = 0, 1 or 3, column j is eligible for B, |
592 |
* with 3 being "preferred". |
593 |
* If hs(j) = 2, 4 or 5, column j is ignored. |
594 |
* |
595 |
* |
596 |
* Crash has several stages. |
597 |
* |
598 |
* Stage 1: Insert any slacks (N, L or G rows, hrtype = 1 or 2). |
599 |
* |
600 |
* Stage 2: Do triangular crash on any free columns (wide bounds) |
601 |
* |
602 |
* Stage 3: Do triangular crash on "preferred" columns (hs(j) < 0). |
603 |
* For the linear crash, this includes variables set |
604 |
* between their bounds in the MPS file via FR INITIAL. |
605 |
* For the nonlinear crash, it includes nonbasics |
606 |
* between their bounds. |
607 |
* (That is, "pegged" variables in both cases.) |
608 |
* |
609 |
* Stage 4: Grab unit columns. |
610 |
* |
611 |
* Stage 5: Grab double columns. |
612 |
* |
613 |
* Stage 6: Do triangular crash on all columns. |
614 |
* |
615 |
* Slacks are then used to pad the basis. |
616 |
* |
617 |
* |
618 |
* ON EXIT |
619 |
* |
620 |
* hs is set to denote an initial (B S N) partition. |
621 |
* hs(j) = 3 denotes variables for the initial basis. |
622 |
* If hs(j) = 2 still, variable j will be superbasic. |
623 |
* If hs(j) = 4 or 5 still, it will be changed to 0 or 1 |
624 |
* by m4chek and variable j will be nonbasic. |
625 |
* |
626 |
* xn If lcrash <= 4, slacks xn(n+1:nb) are initialized. |
627 |
* |
628 |
* ------------------------------------------------------------------ |
629 |
* Nov 1986: Essentially the same as in 1976. |
630 |
* Crash tolerance added. |
631 |
* Attention paid to various hs values. |
632 |
* |
633 |
* 12 Nov 1988: After free rows and columns have been processed |
634 |
* (stage 1 and 2), slacks on L or G rows are inserted |
635 |
* if their rows have not yet been assigned. |
636 |
* |
637 |
* 28 Dec 1988: Refined as follows. |
638 |
* Stage 1 inserts free and preferred rows (slacks). |
639 |
* Stage 2 performs a triangular crash on free or |
640 |
* preferred columns, ignoring free rows. |
641 |
* Unpivoted L or G slacks are then inserted. |
642 |
* Stage 3 performs a triangular crash on the other |
643 |
* columns, ignoring rows whose slack is basic. |
644 |
* (Such rows form the top part of U. The |
645 |
* remaining rows form the beginning of L.) |
646 |
* |
647 |
* 30 Apr 1989: Stage 1 now also looks for singleton columns |
648 |
* (ignoring free and preferred rows). |
649 |
* 05 May 1989: Stage 2 doesn't insert slacks if crash option < 0. |
650 |
* |
651 |
* 06 Dec 1989: Stage 2, 3, 4 modified. Columns of length 2 are |
652 |
* now treated specially. |
653 |
* |
654 |
* 20 Dec 1989: Stage 2 thru 5 modified. Free columns done before |
655 |
* unit and double columns. |
656 |
* |
657 |
* 19 May 1992: xn now used to help initialize slacks. |
658 |
* Stage 1 thru 7 redefined as above. |
659 |
* |
660 |
* 01 Jun 1992: abs used to define closeness of slacks to bounds. |
661 |
* Unfortunately, xn(1:n) seldom has meaningful values. |
662 |
* |
663 |
* 02 Jun 1992: Poor performance on the larger problems. |
664 |
* Reverted to simple approach: all slacks grabbed. |
665 |
* |
666 |
* 04 Jun 1992: Compromise -- Crash 3 now has 3 phases: |
667 |
* (a) E rows. |
668 |
* (b) LG rows. |
669 |
* (c) Nonlinear rows. |
670 |
* xn(1:n) should then define the slack values better |
671 |
* for (b) and (c). |
672 |
* ------------------------------------------------------------------ |
673 |
|
674 |
common /m1eps / eps,eps0,eps1,eps2,eps3,eps4,eps5,plinfy |
675 |
common /m1file/ iread,iprint,isumm |
676 |
common /m2parm/ dparm(30),iparm(30) |
677 |
common /m5log1/ idebug,ierr,lprint |
678 |
common /m7len / fobj ,fobj2 ,nnobj ,nnobj0 |
679 |
common /m8len / njac ,nncon ,nncon0,nnjac |
680 |
|
681 |
equivalence ( iparm(1), icrash ) |
682 |
equivalence ( dparm(5), tcrash ) |
683 |
|
684 |
intrinsic abs, max |
685 |
double precision apiv(2) |
686 |
integer ipiv(2) |
687 |
parameter ( nstage = 6 ) |
688 |
integer num(nstage), stage |
689 |
logical free, prefer, gotslk, |
690 |
$ stage2, stage3, stage4, stage5 |
691 |
parameter ( zero = 0.0d+0, |
692 |
$ small = 1.0d-3, big = 1.0d+4 ) |
693 |
|
694 |
if (iprint .gt. 0) then |
695 |
if (lcrash .le. 3) write(iprint, 1000) icrash |
696 |
if (lcrash .eq. 3 .and. nncon .lt. m) write(iprint, 1030) |
697 |
if (lcrash .eq. 4) write(iprint, 1040) |
698 |
if (lcrash .eq. 5) write(iprint, 1050) |
699 |
end if |
700 |
|
701 |
if (lcrash .le. 4) then |
702 |
|
703 |
* Sets slacks xn(n+1:nb) = - A*xn. |
704 |
* This is where the slacks are initialized. |
705 |
* They may be altered later (see the end of Crash). |
706 |
|
707 |
call dload ( m, zero, xn(n+1), 1 ) |
708 |
call m2aprd( 5, xn, n, xn(n+1), m, |
709 |
$ ne, nka, a, ha, ka, |
710 |
$ z, nwcore ) |
711 |
end if |
712 |
|
713 |
* ------------------------------------------------------------------ |
714 |
* For Crash option 0, set hs(j) = 3 for all slacks and quit. |
715 |
* ------------------------------------------------------------------ |
716 |
if (lcrash .eq. 0) then |
717 |
call hload ( n, 0, hs , 1 ) |
718 |
call hload ( m, 3, hs(n+1), 1 ) |
719 |
go to 900 |
720 |
end if |
721 |
|
722 |
* ------------------------------------------------------------------ |
723 |
* Crash option 1, 2 or 3. lcrash = 1, 2, 3, 4, or 5. |
724 |
* tolslk measures closeness of slacks to bounds. |
725 |
* i1,i2 are the first and last rows of A involved in Stage 1. |
726 |
* ------------------------------------------------------------------ |
727 |
tolslk = 0.25 |
728 |
call iload ( nstage, 0, num, 1 ) |
729 |
|
730 |
if (lcrash .le. 3) then |
731 |
* --------------------------------------------------------------- |
732 |
* First call. lcrash = 1, 2 or 3. |
733 |
* Initialize hpiv(*) for all rows and hs(*) for all slacks. |
734 |
* --------------------------------------------------------------- |
735 |
i1 = 1 |
736 |
if (lcrash .ge. 2) i1 = nncon + 1 |
737 |
i2 = m |
738 |
nrows = i2 - i1 + 1 |
739 |
|
740 |
* Make sure there are no basic columns already (hs(j) = 3). |
741 |
* If there are, make them "preferred". |
742 |
|
743 |
do 20 j = 1, n |
744 |
if (hs(j) .eq. 3) hs(j) = -1 |
745 |
20 continue |
746 |
|
747 |
* Make relevant rows available: hpiv(i) = 1, hs(n+i) = 0. |
748 |
|
749 |
if (nrows .gt. 0) then |
750 |
call hload ( nrows, 1, hpiv(i1), 1 ) |
751 |
call hload ( nrows, 0, hs(n+i1), 1 ) |
752 |
end if |
753 |
|
754 |
if (lcrash .eq. 1) then |
755 |
nbasic = 0 |
756 |
else |
757 |
|
758 |
* lcrash = 2 or 3: Insert nonlinear slacks. |
759 |
|
760 |
nbasic = nncon |
761 |
if (nncon .gt. 0) then |
762 |
call hload ( nncon, 3, hpiv , 1 ) |
763 |
call hload ( nncon, 3, hs(n+1), 1 ) |
764 |
end if |
765 |
end if |
766 |
|
767 |
if (lcrash .eq. 3) then |
768 |
|
769 |
* Insert linear inequality slacks (including free rows). |
770 |
|
771 |
do 25 i = i1, m |
772 |
if (hrtype(i) .ge. 1) then |
773 |
nbasic = nbasic + 1 |
774 |
nrows = nrows - 1 |
775 |
hpiv(i) = 3 |
776 |
hs(n+i) = 3 |
777 |
end if |
778 |
25 continue |
779 |
end if |
780 |
|
781 |
* We're done if there are no relevant rows. |
782 |
|
783 |
if (nrows .eq. 0) go to 800 |
784 |
|
785 |
else |
786 |
* --------------------------------------------------------------- |
787 |
* Second or third call. lcrash = 4 or 5. |
788 |
* Initialize hpiv(*) for all rows. |
789 |
* hs(*) already defines a basis for the full problem, |
790 |
* but we want to do better by including only some of the slacks. |
791 |
* --------------------------------------------------------------- |
792 |
if (lcrash .eq. 4) then |
793 |
* ------------------------------------------------------------ |
794 |
* Crash on linear LG rows. |
795 |
* ------------------------------------------------------------ |
796 |
if (nncon .eq. m) go to 900 |
797 |
i1 = nncon + 1 |
798 |
i2 = m |
799 |
|
800 |
* Mark nonlinear rows as pivoted: hpiv(i) = 3. |
801 |
|
802 |
nbasic = nncon |
803 |
if (nbasic .gt. 0) then |
804 |
call hload ( nbasic, 3, hpiv, 1 ) |
805 |
end if |
806 |
|
807 |
* Mark linear E rows as pivoted: hpiv(i) = 3 |
808 |
* Make linear LG rows available: hpiv(i) = 1, hs(n+i) = 0. |
809 |
|
810 |
do 30 i = i1, m |
811 |
if (hrtype(i) .eq. 0) then |
812 |
nbasic = nbasic + 1 |
813 |
hpiv(i) = 3 |
814 |
else |
815 |
hpiv(i) = 1 |
816 |
hs(n+i) = 0 |
817 |
end if |
818 |
30 continue |
819 |
|
820 |
* Mark linear LG rows with hpiv(i) = 2 |
821 |
* if any basic columns contain a nonzero in row i. |
822 |
|
823 |
do 50 j = 1, n |
824 |
if (hs(j) .eq. 3) then |
825 |
do 40 k = ka(j), ka(j+1) - 1 |
826 |
i = ha(k) |
827 |
if (hrtype(i) .eq. 1) then |
828 |
if (i .gt. nncon) then |
829 |
if (a(k) .ne. zero) hpiv(i) = 2 |
830 |
end if |
831 |
end if |
832 |
40 continue |
833 |
end if |
834 |
50 continue |
835 |
|
836 |
else |
837 |
* ------------------------------------------------------------ |
838 |
* lcrash = 5. Crash on nonlinear rows. |
839 |
* ------------------------------------------------------------ |
840 |
i1 = 1 |
841 |
i2 = nncon |
842 |
|
843 |
* Mark all linear rows as pivoted: hpiv(i) = 3 |
844 |
|
845 |
nbasic = m - nncon |
846 |
if (nbasic .gt. 0) then |
847 |
call hload ( nbasic, 3, hpiv(nncon+1), 1 ) |
848 |
end if |
849 |
|
850 |
* Make nonlinear rows available: hpiv(i) = 1, hs(n+i) = 0. |
851 |
|
852 |
call hload ( nncon, 1, hpiv , 1 ) |
853 |
call hload ( nncon, 0, hs(n+1), 1 ) |
854 |
|
855 |
* Mark nonlinear rows with hpiv(i) = 2 |
856 |
* if any basic columns contain a nonzero in row i. |
857 |
|
858 |
do 70 j = 1, n |
859 |
if (hs(j) .eq. 3) then |
860 |
do 60 k = ka(j), ka(j+1) - 1 |
861 |
i = ha(k) |
862 |
if (i .le. nncon) then |
863 |
if (a(k) .ne. zero) hpiv(i) = 2 |
864 |
end if |
865 |
60 continue |
866 |
end if |
867 |
70 continue |
868 |
end if |
869 |
end if |
870 |
|
871 |
* ------------------------------------------------------------------ |
872 |
* Stage 1: Insert relevant slacks (N, L or G rows, hrtype = 1 or 2). |
873 |
* If lcrash = 4 or 5, grab them only if they are more than |
874 |
* tolslk from their bound. |
875 |
* ------------------------------------------------------------------ |
876 |
stage = 1 |
877 |
gotslk = lcrash .eq. 4 .or. lcrash .eq. 5 |
878 |
|
879 |
do 100 i = i1, i2 |
880 |
j = n + i |
881 |
if (hs(j) .le. 1 .and. hrtype(i) .gt. 0) then |
882 |
if (gotslk) then |
883 |
d1 = xn(j) - bl(j) |
884 |
d2 = bu(j) - xn(j) |
885 |
if (min( d1, d2 ) .le. tolslk) then |
886 |
|
887 |
* The slack is close to a bound or infeasible. |
888 |
* Move it exactly onto the bound. |
889 |
|
890 |
if (d1 .le. d2) then |
891 |
xn(j) = bl(j) |
892 |
hs(j) = 0 |
893 |
else |
894 |
xn(j) = bu(j) |
895 |
hs(j) = 1 |
896 |
end if |
897 |
go to 100 |
898 |
end if |
899 |
end if |
900 |
|
901 |
nbasic = nbasic + 1 |
902 |
num(stage) = num(stage) + 1 |
903 |
hpiv(i) = 3 |
904 |
hs(j) = 3 |
905 |
end if |
906 |
100 continue |
907 |
|
908 |
if (nbasic .eq. m) go to 700 |
909 |
|
910 |
* ------------------------------------------------------------------ |
911 |
* Apply a triangular crash to various subsets of the columns of A. |
912 |
* |
913 |
* hpiv(i) = 1 if row i is unmarked (initial state). |
914 |
* hpiv(i) = 3 if row i has been given a pivot |
915 |
* in one of a set of triangular columns. |
916 |
* hpiv(i) = 2 if one of the triangular columns contains |
917 |
* a nonzero in row i below the triangle. |
918 |
* ------------------------------------------------------------------ |
919 |
|
920 |
do 600 stage = 2, nstage |
921 |
stage2 = stage .eq. 2 |
922 |
stage3 = stage .eq. 3 |
923 |
stage4 = stage .eq. 4 |
924 |
stage5 = stage .eq. 5 |
925 |
|
926 |
* --------------------------------------------------------------- |
927 |
* Main loop for triangular crash. |
928 |
* --------------------------------------------------------------- |
929 |
do 200 j = 1, n |
930 |
js = hs(j) |
931 |
if (js .gt. 1 ) go to 200 |
932 |
if (bl(j) .eq. bu(j)) go to 200 |
933 |
|
934 |
if ( stage2 ) then |
935 |
free = bl(j) .le. - big .and. bu(j) .ge. big |
936 |
if ( .not. free ) go to 200 |
937 |
|
938 |
else if ( stage3 ) then |
939 |
prefer = js .lt. 0 |
940 |
if ( .not. prefer) go to 200 |
941 |
end if |
942 |
|
943 |
* Find the biggest aij, ignoring free rows. |
944 |
|
945 |
k1 = ka(j) |
946 |
k2 = ka(j+1) - 1 |
947 |
aimax = zero |
948 |
|
949 |
do 130 k = k1, k2 |
950 |
i = ha(k) |
951 |
if (hrtype(i) .ne. 2) then |
952 |
ai = a(k) |
953 |
aimax = max( aimax, abs( ai ) ) |
954 |
end if |
955 |
130 continue |
956 |
|
957 |
* Prevent small pivots if crash tol is too small. |
958 |
|
959 |
if (aimax .le. small) go to 200 |
960 |
|
961 |
* Find the biggest pivots in rows that are still |
962 |
* unpivoted and unmarked. Ignore smallish elements. |
963 |
* nz counts the number of relevant nonzeros. |
964 |
|
965 |
aitol = aimax * tcrash |
966 |
nz = 0 |
967 |
npiv = 0 |
968 |
ipiv(1) = 0 |
969 |
ipiv(2) = 0 |
970 |
apiv(1) = zero |
971 |
apiv(2) = zero |
972 |
|
973 |
do 150 k = k1, k2 |
974 |
i = ha(k) |
975 |
if (hs(n+i) .ne. 3) then |
976 |
ai = abs( a(k) ) |
977 |
if (ai .gt. aitol) then |
978 |
nz = nz + 1 |
979 |
ip = hpiv(i) |
980 |
if (ip .le. 2) then |
981 |
if (apiv(ip) .lt. ai) then |
982 |
apiv(ip) = ai |
983 |
ipiv(ip) = i |
984 |
end if |
985 |
else |
986 |
npiv = npiv + 1 |
987 |
end if |
988 |
end if |
989 |
end if |
990 |
150 continue |
991 |
|
992 |
* Grab unit or double columns. |
993 |
|
994 |
if ( stage4 ) then |
995 |
if (nz .ne. 1) go to 200 |
996 |
else if ( stage5 ) then |
997 |
if (nz .ne. 2) go to 200 |
998 |
end if |
999 |
|
1000 |
* See if the column contained a potential pivot. |
1001 |
* An unmarked row is favored over a marked row. |
1002 |
|
1003 |
ip = 1 |
1004 |
if (ipiv(1) .eq. 0 .and. npiv .eq. 0) ip = 2 |
1005 |
i = ipiv(ip) |
1006 |
|
1007 |
if (i .gt. 0) then |
1008 |
nbasic = nbasic + 1 |
1009 |
num(stage) = num(stage) + 1 |
1010 |
hpiv(i) = 3 |
1011 |
hs(j) = 3 |
1012 |
if (nbasic .ge. m) go to 700 |
1013 |
|
1014 |
* Mark off all relevant unmarked rows. |
1015 |
|
1016 |
do 180 k = k1, k2 |
1017 |
i = ha(k) |
1018 |
if (hs(n+i) .ne. 3) then |
1019 |
ai = abs( a(k) ) |
1020 |
if (ai .gt. aitol) then |
1021 |
if (hpiv(i) .eq. 1) hpiv(i) = 2 |
1022 |
end if |
1023 |
end if |
1024 |
180 continue |
1025 |
end if |
1026 |
200 continue |
1027 |
600 continue |
1028 |
|
1029 |
* ------------------------------------------------------------------ |
1030 |
* All stages finished. |
1031 |
* Fill remaining gaps with slacks. |
1032 |
* ------------------------------------------------------------------ |
1033 |
700 npad = m - nbasic |
1034 |
if (iprint .gt. 0) write(iprint, 1200) num, npad |
1035 |
|
1036 |
if (npad .gt. 0) then |
1037 |
do 720 i = 1, m |
1038 |
if (hpiv(i) .lt. 3) then |
1039 |
nbasic = nbasic + 1 |
1040 |
hs(n+i) = 3 |
1041 |
if (nbasic .ge. m) go to 800 |
1042 |
end if |
1043 |
720 continue |
1044 |
end if |
1045 |
|
1046 |
* ------------------------------------------------------------------ |
1047 |
* Make sure there aren't lots of nonbasic slacks floating off |
1048 |
* their bounds. They could take lots of iterations to move. |
1049 |
* ------------------------------------------------------------------ |
1050 |
800 do 850 i = i1, i2 |
1051 |
j = n + i |
1052 |
if (hs(j) .le. 1 .and. hrtype(i) .gt. 0) then |
1053 |
d1 = xn(j) - bl(j) |
1054 |
d2 = bu(j) - xn(j) |
1055 |
if (min( d1, d2 ) .le. tolslk) then |
1056 |
|
1057 |
* The slack is close to a bound or infeasible. |
1058 |
* Move it exactly onto the bound. |
1059 |
|
1060 |
if (d1 .le. d2) then |
1061 |
xn(j) = bl(j) |
1062 |
hs(j) = 0 |
1063 |
else |
1064 |
xn(j) = bu(j) |
1065 |
hs(j) = 1 |
1066 |
end if |
1067 |
end if |
1068 |
end if |
1069 |
850 continue |
1070 |
|
1071 |
900 return |
1072 |
|
1073 |
1000 format(// ' Crash option', i3) |
1074 |
1030 format( ' Crash on linear E rows:') |
1075 |
1040 format( ' Crash on linear LG rows:') |
1076 |
1050 format( ' Crash on nonlinear rows:') |
1077 |
1200 format( |
1078 |
$ ' Slacks', i6, ' Free cols', i6, ' Preferred', i6 |
1079 |
$ / ' Unit ', i6, ' Double ', i6, ' Triangle ', i6, |
1080 |
$ ' Pad', i6) |
1081 |
|
1082 |
* end of m2crsh |
1083 |
end |
1084 |
|
1085 |
*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1086 |
|
1087 |
subroutine m2scal( m, n, nb, ne, nka, nn, nncon, nnjac, |
1088 |
$ hrtype, ha, ka, a, ascale, bl, bu, rmin, rmax ) |
1089 |
|
1090 |
implicit double precision (a-h,o-z) |
1091 |
integer*4 hrtype(m), ha(ne) |
1092 |
integer ka(nka) |
1093 |
double precision a(ne), ascale(nb), bl(nb), bu(nb) |
1094 |
double precision rmin(m), rmax(m) |
1095 |
|
1096 |
* ------------------------------------------------------------------ |
1097 |
* m2scal computes scale factors ascale from A, bl, bu. |
1098 |
* |
1099 |
* In phase 1, an iterative procedure based on geometric means is |
1100 |
* used to compute scales from a alone. This procedure is derived |
1101 |
* from a routine written by Robert Fourer, 1979. The main steps |
1102 |
* are: |
1103 |
* |
1104 |
* (1) Compute aratio = max(i1,i2,j) a(i1,j) / a(i2,j). |
1105 |
* (2) Divide each row i by |
1106 |
* ( min(j) a(i,j) * max(j) a(i,j) ) ** 1/2. |
1107 |
* (3) Divide each column j by |
1108 |
* ( min(i) a(i,j) * max(i) a(i,j) ) ** 1/2. |
1109 |
* (4) Compute sratio as in (1). |
1110 |
* (5) If sratio .lt. scltol * aratio, repeat from step (1). |
1111 |
* |
1112 |
* Free rows (hrtype=2) and fixed columns (bl=bu) are not used |
1113 |
* at this stage. |
1114 |
* |
1115 |
* In phase 2, the scales for free rows are set to be their largest |
1116 |
* element. |
1117 |
* |
1118 |
* In phase 3, fixed columns are summed in order to compute |
1119 |
* a scale factor sigma that allows for the effective rhs of the |
1120 |
* constraints. All scales are then multiplied by sigma. |
1121 |
* |
1122 |
* |
1123 |
* If lscale = 1, the first nncon rows and the first nn columns will |
1124 |
* retain scales of 1.0 during phases 1-2, and phase 3 will not be |
1125 |
* performed. (This takes effect if the problem is nonlinear but |
1126 |
* the user has specified scale linear variables only.) |
1127 |
* However, all rows contribute to the linear column scales, |
1128 |
* and all columns contribute to the linear row scales. |
1129 |
* |
1130 |
* If lscale = 2, all rows and columns are scaled. To guard against |
1131 |
* misleadingly small Jacobians, if the maximum element in any of |
1132 |
* the first nncon rows or the first nnjac columns is less than |
1133 |
* smallj, the corresponding row or column retains a scale of 1.0. |
1134 |
* |
1135 |
* Initial version March 1981. |
1136 |
* Feb 1983. For convenience, everything is now double-precision. |
1137 |
* Aug 1983. Revised to damp the effect of very small elements. |
1138 |
* On each pass, a new row or column scale will not be |
1139 |
* smaller than sqrt(damp) times the largest (scaled) |
1140 |
* element in that row or column. |
1141 |
* Oct 1986. Scale option 2 and phase 3 implemented. |
1142 |
* Nov 1989. Large scales are now reduced to at most 0.1/tolx (say) |
1143 |
* to help prevent obvious infeasibilities when the |
1144 |
* problem is unscaled. |
1145 |
* ------------------------------------------------------------------ |
1146 |
|
1147 |
common /m1eps / eps,eps0,eps1,eps2,eps3,eps4,eps5,plinfy |
1148 |
common /m1file/ iread,iprint,isumm |
1149 |
common /m2parm/ dparm(30),iparm(30) |
1150 |
common /m3scal/ sclobj,scltol,lscale |
1151 |
common /m5log1/ idebug,ierr,lprint |
1152 |
common /m5tols/ toldj(3),tolx,tolpiv,tolrow,rowerr,xnorm |
1153 |
|
1154 |
intrinsic abs, min, max, sqrt |
1155 |
|
1156 |
double precision ac, ar, amin, amax, aratio, bnd, b1, b2, |
1157 |
$ cmin, cmax, cratio, damp, sigma, |
1158 |
$ small, smallj, sratio |
1159 |
|
1160 |
parameter ( zero = 0.0d+0, one = 1.0d+0, |
1161 |
$ damp = 1.0d-4, smallj = 1.0d-2 ) |
1162 |
|
1163 |
if (iprint .gt. 0 ) write(iprint, 1000) |
1164 |
if (scltol .ge. one) scltol = 0.99 |
1165 |
bplus = 0.1*plinfy |
1166 |
aratio = bplus |
1167 |
maxk = 11 |
1168 |
if (lscale .eq. 1) then |
1169 |
* Do linear rows and columns only. |
1170 |
istart = nncon + 1 |
1171 |
jstart = nn + 1 |
1172 |
else |
1173 |
* Do all rows and cols if lscale .ge. 2 |
1174 |
istart = 1 |
1175 |
jstart = 1 |
1176 |
end if |
1177 |
|
1178 |
do 50 j = 1, nb |
1179 |
ascale(j) = one |
1180 |
50 continue |
1181 |
|
1182 |
if (jstart .gt. n) go to 900 |
1183 |
|
1184 |
* ------------------------------------------------------------------ |
1185 |
* Main loop for phase 1. |
1186 |
* Only the following row-types are used: |
1187 |
* hrtype(i) = 2 for n rows (objective or free rows), |
1188 |
* hrtype(i) = 0 or 1 otherwise. |
1189 |
* ------------------------------------------------------------------ |
1190 |
|
1191 |
do 400 kk = 1, maxk |
1192 |
|
1193 |
* Find the largest column ratio. |
1194 |
* Also set new column scales (except on pass 0). |
1195 |
|
1196 |
npass = kk - 1 |
1197 |
amin = bplus |
1198 |
amax = zero |
1199 |
small = smallj |
1200 |
sratio = one |
1201 |
|
1202 |
do 250 j = jstart, n |
1203 |
if (bl(j) .lt. bu(j)) then |
1204 |
cmin = bplus |
1205 |
cmax = zero |
1206 |
|
1207 |
do 230 k = ka(j), ka(j+1) - 1 |
1208 |
i = ha(k) |
1209 |
if (hrtype(i) .eq. 2 ) go to 230 |
1210 |
ar = abs( a(k) ) |
1211 |
if (ar .eq. zero) go to 230 |
1212 |
ar = ar / ascale(n+i) |
1213 |
cmin = min( cmin, ar ) |
1214 |
cmax = max( cmax, ar ) |
1215 |
230 continue |
1216 |
|
1217 |
ac = max( cmin, damp*cmax ) |
1218 |
ac = sqrt( ac ) * sqrt( cmax ) |
1219 |
if (j .gt. nnjac) small = zero |
1220 |
if (cmax .le. small) ac = one |
1221 |
if (npass .gt. 0 ) ascale(j) = ac |
1222 |
amin = min( amin, cmin / ascale(j) ) |
1223 |
amax = max( amax, cmax / ascale(j) ) |
1224 |
cratio = cmax / cmin |
1225 |
sratio = max( sratio, cratio ) |
1226 |
end if |
1227 |
250 continue |
1228 |
|
1229 |
if (iprint .gt. 0) then |
1230 |
write(iprint, 1200) npass, amin, amax, sratio |
1231 |
end if |
1232 |
if (npass .ge. 3 .and. |
1233 |
$ sratio .ge. aratio*scltol) go to 420 |
1234 |
if (kk .eq. maxk ) go to 420 |
1235 |
aratio = sratio |
1236 |
|
1237 |
|
1238 |
* Set new row scales for the next pass. |
1239 |
|
1240 |
if (istart .le. m) then |
1241 |
do 300 i = istart, m |
1242 |
rmin(i) = bplus |
1243 |
rmax(i) = zero |
1244 |
300 continue |
1245 |
|
1246 |
do 350 j = 1, n |
1247 |
if (bl(j) .lt. bu(j)) then |
1248 |
ac = ascale(j) |
1249 |
|
1250 |
do 330 k = ka(j), ka(j+1) - 1 |
1251 |
i = ha(k) |
1252 |
if (i .lt. istart) go to 330 |
1253 |
ar = abs( a(k) ) |
1254 |
if (ar .eq. zero ) go to 330 |
1255 |
ar = ar / ac |
1256 |
rmin(i) = min( rmin(i), ar ) |
1257 |
rmax(i) = max( rmax(i), ar ) |
1258 |
330 continue |
1259 |
end if |
1260 |
350 continue |
1261 |
|
1262 |
do 360 i = istart, m |
1263 |
j = n + i |
1264 |
ar = rmax(i) |
1265 |
if (i .le. nncon .and. ar .le. smallj) then |
1266 |
ascale(j) = one |
1267 |
else |
1268 |
ac = max( rmin(i), damp*ar ) |
1269 |
ascale(j) = sqrt( ac ) * sqrt( ar ) |
1270 |
end if |
1271 |
360 continue |
1272 |
end if |
1273 |
400 continue |
1274 |
|
1275 |
* ------------------------------------------------------------------ |
1276 |
* End of main loop. |
1277 |
* ------------------------------------------------------------------ |
1278 |
|
1279 |
* Invert the column scales, so that structurals and logicals |
1280 |
* can be treated the same way during subsequent unscaling. |
1281 |
* Find the min and max column scales while we're at it. |
1282 |
* Nov 1989: nclose counts how many are "close" to 1. |
1283 |
* For problems that are already well-scaled, it seemed sensible to |
1284 |
* set the "close" ones exactly equal to 1. |
1285 |
* Tried "close" = (0.5,2.0) and (0.9,1.1), but they helped only |
1286 |
* occasionally. Have decided not to interfree. |
1287 |
|
1288 |
420 amin = bplus |
1289 |
amax = zero |
1290 |
close1 = 0.5 |
1291 |
close2 = 2.0 |
1292 |
nclose = 0 |
1293 |
|
1294 |
|
1295 |
do 430 j = 1, n |
1296 |
ac = one / ascale(j) |
1297 |
|
1298 |
if (amin .gt. ac) then |
1299 |
amin = ac |
1300 |
jmin = j |
1301 |
end if |
1302 |
if (amax .lt. ac) then |
1303 |
amax = ac |
1304 |
jmax = j |
1305 |
end if |
1306 |
|
1307 |
if (ac .gt. close1 .and. ac .lt. close2) then |
1308 |
nclose = nclose + 1 |
1309 |
*---- ac = one |
1310 |
end if |
1311 |
|
1312 |
ascale(j) = ac |
1313 |
430 continue |
1314 |
|
1315 |
* Remember, column scales are upside down. |
1316 |
|
1317 |
amax = one / amax |
1318 |
amin = one / amin |
1319 |
k = max( 1, n - jstart + 1 ) |
1320 |
percnt = nclose * 100.0 / k |
1321 |
if (iprint .gt. 0) then |
1322 |
write(iprint, 1300) |
1323 |
write(iprint, 1310) 'Col', jmax, amax, 'Col', jmin, amin, |
1324 |
$ nclose, percnt |
1325 |
end if |
1326 |
|
1327 |
* ------------------------------------------------------------------ |
1328 |
* Phase 2. Deal with empty rows and free rows. |
1329 |
* Find the min and max row scales while we're at it. |
1330 |
* ------------------------------------------------------------------ |
1331 |
amin = bplus |
1332 |
amax = zero |
1333 |
imin = 0 |
1334 |
imax = 0 |
1335 |
nclose = 0 |
1336 |
|
1337 |
do 440 i = istart, m |
1338 |
j = n + i |
1339 |
|
1340 |
if (hrtype(i) .eq. 2) then |
1341 |
ar = rmax(i) |
1342 |
if (ar .eq. zero) ar = one |
1343 |
else |
1344 |
ar = ascale(j) |
1345 |
if (ar .eq. zero) ar = one |
1346 |
|
1347 |
if (amin .gt. ar) then |
1348 |
amin = ar |
1349 |
imin = i |
1350 |
end if |
1351 |
if (amax .lt. ar) then |
1352 |
amax = ar |
1353 |
imax = i |
1354 |
end if |
1355 |
|
1356 |
if (ar .gt. close1 .and. ar .lt. close2) then |
1357 |
nclose = nclose + 1 |
1358 |
*---- ar = one |
1359 |
end if |
1360 |
end if |
1361 |
|
1362 |
ascale(j) = ar |
1363 |
440 continue |
1364 |
|
1365 |
if (imin .eq. 0) then |
1366 |
amin = zero |
1367 |
amax = zero |
1368 |
end if |
1369 |
k = max( 1, m - istart + 1 ) |
1370 |
percnt = nclose * 100.0 / k |
1371 |
if (iprint .gt. 0) then |
1372 |
write(iprint, 1310) 'Row', imin, amin, 'Row', imax, amax, |
1373 |
$ nclose, percnt |
1374 |
end if |
1375 |
|
1376 |
* ------------------------------------------------------------------ |
1377 |
* Phase 3. |
1378 |
* Compute what is effectively the rhs for the constraints. |
1379 |
* We set rmax = ( A I ) * x for fixed columns and slacks, |
1380 |
* including positive lower bounds and negative upper bounds. |
1381 |
* ------------------------------------------------------------------ |
1382 |
if (lscale .ge. 2) then |
1383 |
call dload ( m, zero, rmax, 1 ) |
1384 |
|
1385 |
do 500 j = 1, nb |
1386 |
bnd = zero |
1387 |
b1 = bl(j) |
1388 |
b2 = bu(j) |
1389 |
if (b1 .eq. b2 ) bnd = b1 |
1390 |
if (b1 .gt. zero) bnd = b1 |
1391 |
if (b2 .lt. zero) bnd = b2 |
1392 |
if (bnd .eq. zero) go to 500 |
1393 |
|
1394 |
if (j .le. n ) then |
1395 |
do 480 k = ka(j), ka(j+1) - 1 |
1396 |
i = ha(k) |
1397 |
rmax(i) = rmax(i) + a(k) * bnd |
1398 |
480 continue |
1399 |
else |
1400 |
* Free slacks never get here, |
1401 |
* so we don't have to skip them. |
1402 |
i = j - n |
1403 |
rmax(i) = rmax(i) + bnd |
1404 |
end if |
1405 |
500 continue |
1406 |
|
1407 |
* We don't want nonzeros in free rows to interfere. |
1408 |
|
1409 |
do 520 i = 1, m |
1410 |
if (hrtype(i) .eq. 2) rmax(i) = zero |
1411 |
520 continue |
1412 |
|
1413 |
* Scale rmax = rmax / (row scales), and use its norm sigma |
1414 |
* to adjust both row and column scales. |
1415 |
|
1416 |
ac = dnorm1( m, rmax, 1 ) |
1417 |
call dddiv ( m, ascale(n+1), 1, rmax, 1 ) |
1418 |
sigma = dnorm1( m, rmax, 1 ) |
1419 |
if (iprint .gt. 0) write(iprint, 1400) ac, sigma |
1420 |
sigma = max( sigma, one ) |
1421 |
call dscal ( nb, sigma, ascale, 1 ) |
1422 |
|
1423 |
* Big scales might lead to excessive infeasibility when the |
1424 |
* problem is unscaled. If any are too big, scale them down. |
1425 |
|
1426 |
amax = zero |
1427 |
do 540 j = 1, n |
1428 |
amax = max( amax, ascale(j) ) |
1429 |
540 continue |
1430 |
|
1431 |
do 550 i = 1, m |
1432 |
if (hrtype(i) .ne. 2) then |
1433 |
amax = max( amax, ascale(n + i) ) |
1434 |
end if |
1435 |
550 continue |
1436 |
|
1437 |
big = 0.1 / tolx |
1438 |
sigma = big / amax |
1439 |
if (sigma .lt. one) then |
1440 |
call dscal ( nb, sigma, ascale, 1 ) |
1441 |
if (iprint .gt. 0) write(iprint, 1410) sigma |
1442 |
end if |
1443 |
end if |
1444 |
|
1445 |
if (iparm(4) .gt. 0 .and. iprint .gt. 0) then |
1446 |
if (istart .le. m) write(iprint,1500) (i,ascale(n+i),i=istart,m) |
1447 |
if (jstart .le. n) write(iprint,1600) (j,ascale(j ),j=jstart,n) |
1448 |
end if |
1449 |
|
1450 |
900 return |
1451 |
|
1452 |
1000 format(// ' Scaling' / ' -------' |
1453 |
$ / ' Min elem Max elem Max col ratio') |
1454 |
1200 format( ' After', i3, 1p, e12.2, e12.2, 0p, f20.2) |
1455 |
1300 format(/ 12x, 'Min scale', 23x, 'Max scale', 6x, |
1456 |
$ 'Between 0.5 and 2.0') |
1457 |
1310 format(1x, a, i7, 1p, e10.1, 12x, a, i7, e10.1, i17, 0p, f8.1) |
1458 |
1400 format(/ ' Norm of fixed columns and slacks', 1p, e20.1 |
1459 |
$ / ' (before and after row scaling) ', 1p, e20.1) |
1460 |
1410 format( ' Scales are large --- reduced by ', 1p, e20.1) |
1461 |
1500 format(// ' Row scales r(i)', |
1462 |
$ 8x, ' a(i,j) = r(i) * scaled a(i,j) / c(j)' |
1463 |
$ / ' ----------------' // 5(i6, g16.5)) |
1464 |
1600 format(// ' Column scales c(j)', |
1465 |
$ 5x, ' x(j) = c(j) * scaled x(j)' |
1466 |
$ / ' -------------------' // 5(i6, g16.5)) |
1467 |
|
1468 |
* end of m2scal |
1469 |
end |
1470 |
|
1471 |
*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1472 |
|
1473 |
subroutine m2scla( mode, m, n, nb, ne, nka, |
1474 |
$ ha, ka, a, ascale, bl, bu, pi, xn ) |
1475 |
|
1476 |
implicit double precision (a-h,o-z) |
1477 |
integer*4 ha(ne) |
1478 |
integer ka(nka) |
1479 |
double precision a(ne), ascale(nb), bl(nb), bu(nb) |
1480 |
double precision pi(m), xn(nb) |
1481 |
|
1482 |
* ------------------------------------------------------------------ |
1483 |
* m2scla scales or unscales a, bl, bu, pi, xn using ascale. |
1484 |
* ------------------------------------------------------------------ |
1485 |
|
1486 |
common /m1eps / eps,eps0,eps1,eps2,eps3,eps4,eps5,plinfy |
1487 |
common /m3scal/ sclobj,scltol,lscale |
1488 |
common /m5lobj/ sinf,wtobj,minimz,ninf,iobj,jobj,kobj |
1489 |
|
1490 |
parameter ( one = 1.0d+0 ) |
1491 |
|
1492 |
bplus = 0.1*plinfy |
1493 |
if (mode .eq. 1) then |
1494 |
* --------------------------------------------------------------- |
1495 |
* mode = 1 --- scale a, bl, bu, xn and pi. |
1496 |
* --------------------------------------------------------------- |
1497 |
do 150 j = 1, nb |
1498 |
scale = ascale(j) |
1499 |
if (j .le. n) then |
1500 |
do 110 k = ka(j), ka(j+1) - 1 |
1501 |
i = ha(k) |
1502 |
a(k) = a(k) * ( scale / ascale(n+i) ) |
1503 |
110 continue |
1504 |
end if |
1505 |
xn(j) = xn(j) / scale |
1506 |
if (bl(j) .gt. -bplus) bl(j) = bl(j) / scale |
1507 |
if (bu(j) .lt. bplus) bu(j) = bu(j) / scale |
1508 |
150 continue |
1509 |
|
1510 |
call ddscl ( m, ascale(n+1), 1, pi, 1 ) |
1511 |
if (jobj .gt. 0) sclobj = ascale(jobj) |
1512 |
else |
1513 |
* --------------------------------------------------------------- |
1514 |
* mode = 2 --- unscale everything. |
1515 |
* --------------------------------------------------------------- |
1516 |
do 250 j = 1, nb |
1517 |
scale = ascale(j) |
1518 |
if (j .le. n) then |
1519 |
do 210 k = ka(j), ka(j+1) - 1 |
1520 |
i = ha(k) |
1521 |
a(k) = a(k) * ( ascale(n+i) / scale ) |
1522 |
210 continue |
1523 |
end if |
1524 |
xn(j) = xn(j) * scale |
1525 |
if (bl(j) .gt. -bplus) bl(j) = bl(j) * scale |
1526 |
if (bu(j) .lt. bplus) bu(j) = bu(j) * scale |
1527 |
250 continue |
1528 |
|
1529 |
call dddiv ( m, ascale(n+1), 1, pi, 1 ) |
1530 |
sclobj = one |
1531 |
end if |
1532 |
|
1533 |
* end of m2scla |
1534 |
end |
1535 |
|
1536 |
*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1537 |
|
1538 |
subroutine m2unpk( jq, m, n, ne, nka, a, ha, ka, y ) |
1539 |
|
1540 |
implicit double precision (a-h,o-z) |
1541 |
integer*4 ha(ne) |
1542 |
integer ka(nka) |
1543 |
double precision a(ne) |
1544 |
double precision y(m) |
1545 |
|
1546 |
* ------------------------------------------------------------------ |
1547 |
* m2unpk expands the jq-th column of ( A I ) into y. |
1548 |
* ------------------------------------------------------------------ |
1549 |
|
1550 |
parameter ( zero = 0.0d+0, one = 1.0d+0 ) |
1551 |
|
1552 |
call dload ( m, zero, y, 1 ) |
1553 |
|
1554 |
if (jq .le. n) then |
1555 |
do 10 k = ka(jq), ka(jq+1) - 1 |
1556 |
i = ha(k) |
1557 |
y(i) = a(k) |
1558 |
10 continue |
1559 |
else |
1560 |
islack = jq - n |
1561 |
y(islack) = one |
1562 |
end if |
1563 |
|
1564 |
* end of m2unpk |
1565 |
end |
1566 |
|
1567 |
*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1568 |
|
1569 |
subroutine matcol( m, n, nb, ne, nka, |
1570 |
$ a, ha, ka, bl, bu, col, ztol ) |
1571 |
|
1572 |
implicit double precision (a-h,o-z) |
1573 |
integer*4 ha(ne) |
1574 |
integer ka(nka) |
1575 |
double precision a(ne), bl(nb), bu(nb), col(m) |
1576 |
|
1577 |
* ------------------------------------------------------------------ |
1578 |
* matcol creates a new matrix column from the dense vector col. |
1579 |
* It becomes column number jnew, which is updated accordingly. |
1580 |
* Elements as small as the zero tolerance ztol are not retained. |
1581 |
* Default bounds are given to the new variable. |
1582 |
* ------------------------------------------------------------------ |
1583 |
|
1584 |
common /m1file/ iread,iprint,isumm |
1585 |
common /m3mps3/ aijtol,bstruc(2),mlst,mer, |
1586 |
$ aijmin,aijmax,na0,line,ier(20) |
1587 |
common /cyclcm/ cnvtol,jnew,materr,maxcy,nephnt,nphant,nprint |
1588 |
|
1589 |
intrinsic abs |
1590 |
|
1591 |
if (jnew .ge. n) go to 900 |
1592 |
jnew = jnew + 1 |
1593 |
ia = ka(jnew) |
1594 |
|
1595 |
do 100 i = 1, m |
1596 |
if (abs( col(i) ) .le. ztol) go to 100 |
1597 |
if (ia .gt. ne) go to 910 |
1598 |
a (ia) = col(i) |
1599 |
ha(ia) = i |
1600 |
ia = ia + 1 |
1601 |
100 continue |
1602 |
|
1603 |
if (ia .eq. ka(jnew)) go to 920 |
1604 |
bl(jnew) = bstruc(1) |
1605 |
bu(jnew) = bstruc(2) |
1606 |
ka(jnew + 1) = ia |
1607 |
return |
1608 |
|
1609 |
* Too many columns. |
1610 |
|
1611 |
900 if (iprint .gt. 0) write(iprint, 1000) |
1612 |
if (isumm .gt. 0) write(isumm , 1000) |
1613 |
go to 990 |
1614 |
|
1615 |
* Too many elements. |
1616 |
|
1617 |
910 if (iprint .gt. 0) write(iprint, 1100) |
1618 |
if (isumm .gt. 0) write(isumm , 1100) |
1619 |
go to 990 |
1620 |
|
1621 |
* Zero column. |
1622 |
|
1623 |
920 if (iprint .gt. 0) write(iprint, 1200) |
1624 |
if (isumm .gt. 0) write(isumm , 1200) |
1625 |
|
1626 |
* Error exit. |
1627 |
|
1628 |
990 materr = materr + 1 |
1629 |
return |
1630 |
|
1631 |
1000 format(/ ' XXX MATCOL error. Not enough Phantom columns.') |
1632 |
1100 format(/ ' XXX MATCOL error. Not enough Phantom elements.') |
1633 |
1200 format(/ ' XXX MATCOL error. New column of A was zero.') |
1634 |
|
1635 |
* end of matcol |
1636 |
end |