#include "lbfgsb.h"
int main(void)
{
integer i__1;
double d__1, d__2;
static double f, g[1024];
static integer i__;
static double l[1024];
static integer m, n;
static double u[1024], x[1024], t1, t2, wa[43251];
static integer nbd[1024], iwa[3072];
static integer taskValue;
static integer *task=&taskValue;
static double factr;
static integer csaveValue;
static integer *csave=&csaveValue;
static double dsave[29];
static integer isave[44];
static logical lsave[4];
static double pgtol;
static integer iprint;
iprint = -1;
factr = 0.;
pgtol = 0.;
n = 25;
m = 5;
i__1 = n;
for (i__ = 1; i__ <= i__1; i__ += 2) {
nbd[i__ - 1] = 2;
l[i__ - 1] = 1.;
u[i__ - 1] = 100.;
}
i__1 = n;
for (i__ = 2; i__ <= i__1; i__ += 2) {
nbd[i__ - 1] = 2;
l[i__ - 1] = -100.;
u[i__ - 1] = 100.;
}
i__1 = n;
for (i__ = 1; i__ <= i__1; ++i__) {
x[i__ - 1] = 3.;
}
printf(" Solving sample problem (Rosenbrock test fcn).\n");
printf(" (f = 0.0 at the optimal solution.)\n");
*task = START;
L111:
setulb(&n, &m, x, l, u, nbd, &f, g, &factr, &pgtol, wa, iwa, task, &
iprint, csave, lsave, isave, dsave);
if ( IS_FG(*task) ) {
d__1 = x[0] - 1.;
f = d__1 * d__1 * .25;
i__1 = n;
for (i__ = 2; i__ <= i__1; ++i__) {
d__2 = x[i__ - 2];
d__1 = x[i__ - 1] - d__2 * d__2;
f += d__1 * d__1;
}
f *= 4.;
d__1 = x[0];
t1 = x[1] - d__1 * d__1;
g[0] = (x[0] - 1.) * 2. - x[0] * 16. * t1;
i__1 = n - 1;
for (i__ = 2; i__ <= i__1; ++i__) {
t2 = t1;
d__1 = x[i__ - 1];
t1 = x[i__] - d__1 * d__1;
g[i__ - 1] = t2 * 8. - x[i__ - 1] * 16. * t1;
}
g[n - 1] = t1 * 8.;
goto L111;
}
if (*task==NEW_X ) {
if (isave[33] >= 99) {
*task = STOP_ITER;
}
if (dsave[12] <= (fabs(f) + 1.) * 1e-10) {
*task = STOP_GRAD;
}
printf("Iterate %5ld nfg = %4ld f = %6.4e |proj g| = %6.4e\n", isave[29], isave[33], f, dsave[12] );
if (IS_STOP(*task)) {
printf(" Final X = \n");
i__1 = n;
for (i__ = 1; i__ <= i__1; ++i__) {
printf("%.3e ", x[i__-1]);
}
printf("\n");
}
goto L111;
}
return 0;
}