8 /* Common Block Declarations */
11 int nres, ndec, nin, nit, nfv, nfg, nfh;
16 /* *********************************************************************** */
17 /* SUBROUTINE PLIP ALL SYSTEMS 01/09/22 */
19 /* GENERAL SUBROUTINE FOR LARGE-SCALE BOX CONSTRAINED MINIMIZATION THAT */
20 /* USE THE SHIFTED LIMITED MEMORY VARIABLE METRIC METHOD BASED ON THE */
21 /* PRODUCT FORM UPDATES. */
24 /* II NF NUMBER OF VARIABLES. */
25 /* II NB CHOICE OF SIMPLE BOUNDS. NB=0-SIMPLE BOUNDS SUPPRESSED. */
26 /* NB>0-SIMPLE BOUNDS ACCEPTED. */
27 /* RI X(NF) VECTOR OF VARIABLES. */
28 /* II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. IX(I)=0-VARIABLE */
29 /* X(I) IS UNBOUNDED. IX(I)=1-LOVER BOUND XL(I).LE.X(I). */
30 /* IX(I)=2-UPPER BOUND X(I).LE.XU(I). IX(I)=3-TWO SIDE BOUND */
31 /* XL(I).LE.X(I).LE.XU(I). IX(I)=5-VARIABLE X(I) IS FIXED. */
32 /* RI XL(NF) VECTOR CONTAINING LOWER BOUNDS FOR VARIABLES. */
33 /* RI XU(NF) VECTOR CONTAINING UPPER BOUNDS FOR VARIABLES. */
34 /* RA GF(NF) GRADIENT OF THE OBJECTIVE FUNCTION. */
35 /* RO S(NF) DIRECTION VECTOR. */
36 /* RU XO(NF) VECTORS OF VARIABLES DIFFERENCE. */
37 /* RI GO(NF) GRADIENTS DIFFERENCE. */
38 /* RA SO(NF) AUXILIARY VECTOR. */
39 /* RA XM(NF*MF) AUXILIARY VECTOR. */
40 /* RA XR(MF) AUXILIARY VECTOR. */
41 /* RA GR(MF) AUXILIARY VECTOR. */
42 /* RI XMAX MAXIMUM STEPSIZE. */
43 /* RI TOLX TOLERANCE FOR CHANGE OF VARIABLES. */
44 /* RI TOLF TOLERANCE FOR CHANGE OF FUNCTION VALUES. */
45 /* RI TOLB TOLERANCE FOR THE FUNCTION VALUE. */
46 /* RI TOLG TOLERANCE FOR THE GRADIENT NORM. */
47 /* RI FMIN ESTIMATION OF THE MINIMUM FUNCTION VALUE. */
48 /* RO GMAX MAXIMUM PARTIAL DERIVATIVE. */
49 /* RO F VALUE OF THE OBJECTIVE FUNCTION. */
50 /* II MIT MAXIMUM NUMBER OF ITERATIONS. */
51 /* II MFV MAXIMUM NUMBER OF FUNCTION EVALUATIONS. */
52 /* II IEST ESTIMATION INDICATOR. IEST=0-MINIMUM IS NOT ESTIMATED. */
53 /* IEST=1-MINIMUM IS ESTIMATED BY THE VALUE FMIN. */
54 /* II MET METHOD USED. MET=1-RANK-ONE METHOD. MET=2-RANK-TWO */
56 /* II MF NUMBER OF LIMITED MEMORY STEPS. */
57 /* II IPRNT PRINT SPECIFICATION. IPRNT=0-NO PRINT. */
58 /* ABS(IPRNT)=1-PRINT OF FINAL RESULTS. */
59 /* ABS(IPRNT)=2-PRINT OF FINAL RESULTS AND ITERATIONS. */
60 /* IPRNT>0-BASIC FINAL RESULTS. IPRNT<0-EXTENDED FINAL */
62 /* IO ITERM VARIABLE THAT INDICATES THE CAUSE OF TERMINATION. */
63 /* ITERM=1-IF ABS(X-XO) WAS LESS THAN OR EQUAL TO TOLX IN */
64 /* MTESX (USUALLY TWO) SUBSEQUEBT ITERATIONS. */
65 /* ITERM=2-IF ABS(F-FO) WAS LESS THAN OR EQUAL TO TOLF IN */
66 /* MTESF (USUALLY TWO) SUBSEQUEBT ITERATIONS. */
67 /* ITERM=3-IF F IS LESS THAN OR EQUAL TO TOLB. */
68 /* ITERM=4-IF GMAX IS LESS THAN OR EQUAL TO TOLG. */
69 /* ITERM=6-IF THE TERMINATION CRITERION WAS NOT SATISFIED, */
70 /* BUT THE SOLUTION OBTAINED IS PROBABLY ACCEPTABLE. */
71 /* ITERM=11-IF NIT EXCEEDED MIT. ITERM=12-IF NFV EXCEEDED MFV. */
72 /* ITERM=13-IF NFG EXCEEDED MFG. ITERM<0-IF THE METHOD FAILED. */
74 /* VARIABLES IN COMMON /STAT/ (STATISTICS) : */
75 /* IO NRES NUMBER OF RESTARTS. */
76 /* IO NDEC NUMBER OF MATRIX DECOMPOSITION. */
77 /* IO NIN NUMBER OF INNER ITERATIONS. */
78 /* IO NIT NUMBER OF ITERATIONS. */
79 /* IO NFV NUMBER OF FUNCTION EVALUATIONS. */
80 /* IO NFG NUMBER OF GRADIENT EVALUATIONS. */
81 /* IO NFH NUMBER OF HESSIAN EVALUATIONS. */
83 /* SUBPROGRAMS USED : */
84 /* S PCBS04 ELIMINATION OF BOX CONSTRAINT VIOLATIONS. */
85 /* S PS1L01 STEPSIZE SELECTION USING LINE SEARCH. */
86 /* S PULSP3 SHIFTED VARIABLE METRIC UPDATE. */
87 /* S PULVP3 SHIFTED LIMITED-MEMORY VARIABLE METRIC UPDATE. */
88 /* S PYADC0 ADDITION OF A BOX CONSTRAINT. */
89 /* S PYFUT1 TEST ON TERMINATION. */
90 /* S PYRMC0 DELETION OF A BOX CONSTRAINT. */
91 /* S PYTRCD COMPUTATION OF PROJECTED DIFFERENCES FOR THE VARIABLE METRIC */
93 /* S PYTRCG COMPUTATION OF THE PROJECTED GRADIENT. */
94 /* S PYTRCS COMPUTATION OF THE PROJECTED DIRECTION VECTOR. */
95 /* S MXDRMM MULTIPLICATION OF A ROWWISE STORED DENSE RECTANGULAR */
96 /* MATRIX A BY A VECTOR X. */
97 /* S MXDCMD MULTIPLICATION OF A COLUMNWISE STORED DENSE RECTANGULAR */
98 /* MATRIX A BY A VECTOR X AND ADDITION OF THE SCALED VECTOR */
100 /* S MXUCOP COPYING OF A VECTOR. */
101 /* S MXUDIR VECTOR AUGMENTED BY THE SCALED VECTOR. */
102 /* RF MXUDOT DOT PRODUCT OF TWO VECTORS. */
103 /* S MXUNEG COPYING OF A VECTOR WITH CHANGE OF THE SIGN. */
104 /* S MXUZER VECTOR ELEMENTS CORRESPONDING TO ACTIVE BOUNDS ARE SET */
106 /* S MXVCOP COPYING OF A VECTOR. */
108 /* EXTERNAL SUBROUTINES : */
109 /* SE OBJ COMPUTATION OF THE VALUE OF THE OBJECTIVE FUNCTION. */
110 /* CALLING SEQUENCE: CALL OBJ(NF,X,FF) WHERE NF IS THE NUMBER */
111 /* OF VARIABLES, X(NF) IS THE VECTOR OF VARIABLES AND FF IS */
112 /* THE VALUE OF THE OBJECTIVE FUNCTION. */
113 /* SE DOBJ COMPUTATION OF THE GRADIENT OF THE OBJECTIVE FUNCTION. */
114 /* CALLING SEQUENCE: CALL DOBJ(NF,X,GF) WHERE NF IS THE NUMBER */
115 /* OF VARIABLES, X(NF) IS THE VECTOR OF VARIABLES AND GF(NF) */
116 /* IS THE GRADIENT OF THE OBJECTIVE FUNCTION. */
119 /* HYBRID METHOD WITH SPARSE MARWIL UPDATES FOR SPARSE LEAST SQUARES */
122 static void plip_(int *nf, int *nb, double *x, int *
123 ix, double *xl, double *xu, double *gf, double *s,
124 double *xo, double *go, double *so, double *xm,
125 double *xr, double *gr, double *xmax, double *tolx,
126 double *tolf, double *tolb, double *tolg, double *
127 fmin, double *gmax, double *f, int *mit, int *mfv,
128 int *iest, int *met, int *mf, int *iprnt, int *
131 /* System generated locals */
135 /* Builtin functions */
137 /* Local variables */
143 double po, pp, ro, rp;
145 extern static void obj_(int *, double *, double *);
148 double alf1, alf2, eta0, eta9, par1, par2;
149 int mes1, mes2, mes3, met3;
151 extern static void dobj_(int *, double *, double *);
152 int meta, mred, nred, iold;
154 extern static void luksan_ps1l01__(double *, double *,
155 double *, double *, double *, double *,
156 double *, double *, double *, double *,
157 double *, double *, double *, double *,
158 double *, double *, int *, int *, int *,
159 int *, int *, int *, int *, int *, int *,
160 int *, int *, int *, int *);
164 double rmin, rmax, umax, tolp, tols;
166 extern static void luksan_pcbs04__(int *, double *,
167 int *, double *, double *, double *, int *);
169 extern static void luksan_pyadc0__(int *, int *,
170 double *, int *, double *, double *, int *);
171 int iterd, iterh, mtesf, ntesf;
173 extern static void luksan_pyrmc0__(int *, int *, int
174 *, double *, double *, double *, double *,
175 double *, int *, int *);
176 int iters, irest, inits, kters, maxst;
179 extern static void luksan_pulsp3__(int *, int *, int
180 *, double *, double *, double *, double *,
181 double *, double *, double *, int *, int *),
182 luksan_pyfut1__(int *, double *, double *, double
183 *, double *, double *, double *, double *,
184 double *, double *, int *, int *, int *,
185 int *, int *, int *, int *, int *, int *,
186 int *, int *, int *, int *, int *, int *,
187 int *, int *, int *), luksan_pulvp3__(int *,
188 int *, double *, double *, double *, double *,
189 double *, double *, double *, double *,
190 double *, double *, int *, int *, int *,
191 int *), luksan_mxdcmd__(int *, int *, double *,
192 double *, double *, double *, double *),
193 luksan_mxuneg__(int *, double *, double *, int *,
194 int *), luksan_mxdrmm__(int *, int *, double *,
195 double *, double *), luksan_pytrcd__(int *,
196 double *, int *, double *, double *, double *,
197 double *, double *, double *, double *,
198 double *, double *, int *, int *, int *,
199 int *), luksan_pytrcg__(int *, int *, int *,
200 double *, double *, double *, int *, int *),
201 luksan_mxudir__(int *, double *, double *, double
202 *, double *, int *, int *), luksan_mxucop__(int *,
203 double *, double *, int *, int *),
204 luksan_mxvcop__(int *, double *, double *),
205 luksan_pytrcs__(int *, double *, int *, double *,
206 double *, double *, double *, double *,
207 double *, double *, double *, double *,
208 double *, double *, double *, double *,
209 double *, int *), luksan_mxuzer__(int *, double *,
211 extern double mxudot_(int *, double *, double *, int *
217 /* Parameter adjustments */
292 *tolb = *fmin + 1e-16;
309 kit = -(ires1 * *nf + ires2);
312 /* INITIAL OPERATIONS WITH SIMPLE BOUNDS */
316 for (i__ = 1; i__ <= i__1; ++i__) {
317 if ((ix[i__] == 3 || ix[i__] == 4) && xu[i__] <= xl[i__]) {
320 } else if (ix[i__] == 5 || ix[i__] == 6) {
327 luksan_pcbs04__(nf, &x[1], &ix[1], &xl[1], &xu[1], &eps9, &kbf);
328 luksan_pyadc0__(nf, &n, &x[1], &ix[1], &xl[1], &xu[1], &inew);
335 dobj_(nf, &x[1], &gf[1]);
338 luksan_pytrcg__(nf, nf, &ix[1], &gf[1], &umax, gmax, &kbf, &iold);
339 luksan_pyfut1__(nf, f, &fo, &umax, gmax, &dmax__, tolx, tolf, tolb, tolg,
340 &kd, &stat_1.nit, &kit, mit, &stat_1.nfv, mfv, &stat_1.nfg, &mfg,
341 &ntesx, &mtesx, &ntesf, &mtesf, &ites, &ires1, &ires2, &irest, &
346 if (kbf > 0 && rmax > 0.) {
347 luksan_pyrmc0__(nf, &n, &ix[1], &gf[1], &eps8, &umax, gmax, &rmax, &
355 if (kit < stat_1.nit) {
369 /* DIRECTION DETERMINATION */
371 gnorm = sqrt(mxudot_(nf, &gf[1], &gf[1], &ix[1], &kbf));
373 /* NEWTON LIKE STEP */
375 luksan_mxuneg__(nf, &gf[1], &s[1], &ix[1], &kbf);
376 luksan_mxdrmm__(nf, &nn, &xm[1], &s[1], &gr[1]);
377 luksan_mxdcmd__(nf, &nn, &xm[1], &gr[1], &par, &s[1], &s[1]);
378 luksan_mxuzer__(nf, &s[1], &ix[1], &kbf);
380 snorm = sqrt(mxudot_(nf, &s[1], &s[1], &ix[1], &kbf));
382 /* TEST ON DESCENT DIRECTION AND PREPARATION OF LINE SEARCH */
385 p = mxudot_(nf, &gf[1], &s[1], &ix[1], &kbf);
391 /* TEST ON DESCENT DIRECTION */
394 irest = max(irest,1);
395 } else if (p + told * gnorm * snorm <= 0.) {
399 /* UNIFORM DESCENT CRITERION */
401 irest = max(irest,1);
405 /* PREPARATION OF LINE SEARCH */
408 rmin = alf1 * gnorm / snorm;
410 d__1 = alf2 * gnorm / snorm, d__2 = *xmax / snorm;
411 rmax = min(d__1,d__2);
420 luksan_pytrcs__(nf, &x[1], &ix[1], &xo[1], &xl[1], &xu[1], &gf[1], &go[1],
421 &s[1], &ro, &fp, &fo, f, &po, &p, &rmax, &eta9, &kbf);
426 luksan_ps1l01__(&r__, &rp, f, &fo, &fp, &p, &po, &pp, fmin, &fmax, &rmin,
427 &rmax, &tols, &tolp, &par1, &par2, &kd, &ld, &stat_1.nit, &kit, &
428 nred, &mred, &maxst, iest, &inits, &iters, &kters, &mes, &isys);
432 luksan_mxudir__(nf, &r__, &s[1], &xo[1], &x[1], &ix[1], &kbf);
433 luksan_pcbs04__(nf, &x[1], &ix[1], &xl[1], &xu[1], &eps9, &kbf);
436 dobj_(nf, &x[1], &gf[1]);
438 p = mxudot_(nf, &gf[1], &s[1], &ix[1], &kbf);
445 luksan_mxvcop__(nf, &xo[1], &x[1]);
446 luksan_mxvcop__(nf, &go[1], &gf[1]);
447 irest = max(irest,1);
451 luksan_mxuneg__(nf, &go[1], &s[1], &ix[1], &kbf);
452 luksan_pytrcd__(nf, &x[1], &ix[1], &xo[1], &gf[1], &go[1], &r__, f, &fo, &
453 p, &po, &dmax__, &kbf, &kd, &ld, &iters);
454 luksan_mxucop__(nf, &gf[1], &so[1], &ix[1], &kbf);
456 luksan_pulsp3__(nf, &nn, mf, &xm[1], &gr[1], &xo[1], &go[1], &r__, &
457 po, &par, &iterh, &met3);
459 luksan_pulvp3__(nf, &nn, &xm[1], &xr[1], &gr[1], &s[1], &so[1], &xo[1]
460 , &go[1], &r__, &po, &par, &iterh, &mec, &met3, met);
464 irest = max(irest,1);
467 luksan_pyadc0__(nf, &n, &x[1], &ix[1], &xl[1], &xu[1], &inew);