#include "lbfgsb.h"
int main(void)
{
integer i__1;
double d__1, d__2;
static double f, g[1024];
static integer i__, j;
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 time1, time2, factr;
static integer csaveValue;
static integer *csave=&csaveValue;
static double dsave[29];
static integer isave[44];
static logical lsave[4];
static double pgtol;
static double tlimit;
static integer iprint;
tlimit = .2f;
iprint = -1;
factr = 0.;
pgtol = 0.;
n = 1000;
m = 10;
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.\n");
printf(" (f = 0.0 at the optimal solution.)\n");
*task = START;
timer(&time1);
L111:
setulb(&n, &m, x, l, u, nbd, &f, g, &factr, &pgtol, wa, iwa, task, &
iprint, csave, lsave, isave, dsave);
if (IS_FG(*task) ) {
timer(&time2);
if (time2 - time1 > tlimit) {
*task = STOP_CPU;
j = n * 3 + (m << 1) * n + m * m * 11;
printf("Latest iterate X=");
for (i__ = j + 1; i__ <= m ; ++i__) {
printf("%.2e ", wa[i__ -1] );
}
printf("\n");
printf("At latest iterate f = %.2e, |proj g| = %.2e\n", dsave[1], dsave[12] );
} else {
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] >= 900) {
*task = STOP_ITER;
}
if (dsave[12] <= (fabs(f) + 1.) * 1e-10) {
*task = STOP_GRAD;
}
printf("Iterate %ld, nfg = %ld, f = %.2e, |proj g| = %.2e\n", isave[29], isave[33], f, dsave[12] );
if (IS_STOP(*task)) {
i__1 = n;
printf("Final X = ");
if ( n < 30 ) {
for (i__ = 1; i__ <= i__1; ++i__) {
printf("%.2e ", x[i__ -1] );
}
printf("\n");
} else {
for (i__ = 1; i__ <= 10 ; ++i__) {
printf("%.2e ", x[i__ -1] );
}
printf("... \n ...(suppressing some output)...\n ... ");
for (i__ = n-9; i__ <= n ; ++i__) {
printf("%.2e ", x[i__ -1] );
}
printf("\n");
}
}
goto L111;
}
return 0;
}