📄 lbfgsb.c
字号:
/*< lsnd = isave(11) >*/
lsnd = isave[11];
/*< lz = isave(12) >*/
lz = isave[12];
/*< lr = isave(13) >*/
lr = isave[13];
/*< ld = isave(14) >*/
ld = isave[14];
/*< lt = isave(15) >*/
lt = isave[15];
/*< lwa = isave(16) >*/
lwa = isave[16];
/*< lsg = isave(17) >*/
lsg = isave[17];
/*< lsgo = isave(18) >*/
lsgo = isave[18];
/*< lyg = isave(19) >*/
lyg = isave[19];
/*< lygo = isave(20) >*/
lygo = isave[20];
/*< >*/
mainlb_(n, m, &x[1], &l[1], &u[1], &nbd[1], f, &g[1], factr, pgtol, &wa[
lws], &wa[lwy], &wa[lsy], &wa[lss], &wa[lyy], &wa[lwt], &wa[lwn],
&wa[lsnd], &wa[lz], &wa[lr], &wa[ld], &wa[lt], &wa[lwa], &wa[lsg],
&wa[lsgo], &wa[lyg], &wa[lygo], &iwa[1], &iwa[*n + 1], &iwa[(*n
<< 1) + 1], task, iprint, csave, &lsave[1], &isave[22], &dsave[1],
(ftnlen)60, (ftnlen)60);
/*< return >*/
return 0;
/*< end >*/
} /* setulb_ */
/* ======================= The end of setulb ============================= */
/*< >*/
/* Subroutine */ int mainlb_(integer *n, integer *m, doublereal *x,
doublereal *l, doublereal *u, integer *nbd, doublereal *f, doublereal
*g, doublereal *factr, doublereal *pgtol, doublereal *ws, doublereal *
wy, doublereal *sy, doublereal *ss, doublereal *yy, doublereal *wt,
doublereal *wn, doublereal *snd, doublereal *z__, doublereal *r__,
doublereal *d__, doublereal *t, doublereal *wa, doublereal *sg,
doublereal *sgo, doublereal *yg, doublereal *ygo, integer *index,
integer *iwhere, integer *indx2, char *task, integer *iprint, char *
csave, logical *lsave, integer *isave, doublereal *dsave, ftnlen
task_len, ftnlen csave_len)
{
/* System generated locals */
integer ws_dim1, ws_offset, wy_dim1, wy_offset, sy_dim1, sy_offset,
ss_dim1, ss_offset, yy_dim1, yy_offset, wt_dim1, wt_offset,
wn_dim1, wn_offset, snd_dim1, snd_offset, i__1;
doublereal d__1, d__2;
/* Builtin functions */
integer s_cmp(char *, char *, ftnlen, ftnlen);
/* Subroutine */ int s_copy(char *, char *, ftnlen, ftnlen);
/* Local variables */
integer i__, k;
doublereal gd, dr, rr, dtd;
integer col;
doublereal tol;
logical wrk;
doublereal stp;
doublereal cpu1;
doublereal cpu2;
integer head;
doublereal fold;
integer nact;
doublereal ddum;
extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *,
integer *);
integer info;
doublereal time;
integer nfgv, ifun, iter, nint;
char word[3];
doublereal time1, time2;
integer iback;
extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *,
integer *);
doublereal gdold;
integer nfree;
logical boxed;
integer itail;
doublereal theta;
extern /* Subroutine */ int freev_(integer *, integer *, integer *,
integer *, integer *, integer *, integer *, logical *, logical *,
logical *, integer *, integer *), dcopy_(integer *, doublereal *,
integer *, doublereal *, integer *);
doublereal dnorm;
extern /* Subroutine */ int timer_(doublereal *), formk_(integer *,
integer *, integer *, integer *, integer *, integer *, integer *,
logical *, doublereal *, doublereal *, integer *, doublereal *,
doublereal *, doublereal *, doublereal *, integer *, integer *,
integer *);
integer nskip, iword;
extern /* Subroutine */ int formt_(integer *, doublereal *, doublereal *,
doublereal *, integer *, doublereal *, integer *), subsm_(integer
*, integer *, integer *, integer *, doublereal *, doublereal *,
integer *, doublereal *, doublereal *, doublereal *, doublereal *,
doublereal *, integer *, integer *, integer *, doublereal *,
doublereal *, integer *, integer *);
doublereal xstep, stpmx;
extern /* Subroutine */ int prn1lb_(integer *, integer *, doublereal *,
doublereal *, doublereal *, integer *, integer *, doublereal *),
prn2lb_(integer *, doublereal *, doublereal *, doublereal *,
integer *, integer *, integer *, integer *, integer *, doublereal
*, integer *, char *, integer *, integer *, doublereal *,
doublereal *, ftnlen), prn3lb_(integer *, doublereal *,
doublereal *, char *, integer *, integer *, integer *, integer *,
integer *, integer *, integer *, integer *, doublereal *,
doublereal *, integer *, char *, integer *, doublereal *,
doublereal *, integer *, doublereal *, doublereal *, doublereal *,
ftnlen, ftnlen);
integer ileave;
extern /* Subroutine */ int errclb_(integer *, integer *, doublereal *,
doublereal *, doublereal *, integer *, char *, integer *, integer
*, ftnlen);
doublereal cachyt;
integer itfile;
extern /* Subroutine */ int active_(integer *, doublereal *, doublereal *,
integer *, doublereal *, integer *, integer *, logical *,
logical *, logical *), cauchy_(integer *, doublereal *,
doublereal *, doublereal *, integer *, doublereal *, integer *,
integer *, doublereal *, doublereal *, doublereal *, integer *,
doublereal *, doublereal *, doublereal *, doublereal *,
doublereal *, integer *, integer *, doublereal *, doublereal *,
doublereal *, doublereal *, integer *, doublereal *, doublereal *,
integer *, doublereal *, integer *, doublereal *);
doublereal epsmch;
extern /* Subroutine */ int cmprlb_(integer *, integer *, doublereal *,
doublereal *, doublereal *, doublereal *, doublereal *,
doublereal *, doublereal *, doublereal *, doublereal *, integer *,
doublereal *, integer *, integer *, integer *, logical *,
integer *);
logical updatd;
doublereal sbtime;
logical prjctd;
integer iupdat;
extern doublereal dpmeps_();
logical cnstnd;
doublereal sbgnrm;
integer nenter;
doublereal lnscht;
extern /* Subroutine */ int lnsrlb_(integer *, doublereal *, doublereal *,
integer *, doublereal *, doublereal *, doublereal *, doublereal *
, doublereal *, doublereal *, doublereal *, doublereal *,
doublereal *, doublereal *, doublereal *, doublereal *,
doublereal *, doublereal *, doublereal *, integer *, integer *,
integer *, integer *, integer *, char *, logical *, logical *,
char *, integer *, doublereal *, ftnlen, ftnlen), matupd_(integer
*, integer *, doublereal *, doublereal *, doublereal *,
doublereal *, doublereal *, doublereal *, integer *, integer *,
integer *, integer *, doublereal *, doublereal *, doublereal *,
doublereal *, doublereal *);
integer nintol;
extern /* Subroutine */ int projgr_(integer *, doublereal *, doublereal *,
integer *, doublereal *, doublereal *, doublereal *);
(void)task_len;
(void)csave_len;
cpu1 = 0;
cpu2 = 0;
/*< character*60 task, csave >*/
/*< logical lsave(4) >*/
/*< >*/
/*< >*/
/* ************ */
/* Subroutine mainlb */
/* This subroutine solves bound constrained optimization problems by */
/* using the compact formula of the limited memory BFGS updates. */
/* n is an integer variable. */
/* On entry n is the number of variables. */
/* On exit n is unchanged. */
/* m is an integer variable. */
/* On entry m is the maximum number of variable metric */
/* corrections allowed in the limited memory matrix. */
/* On exit m is unchanged. */
/* x is a double precision array of dimension n. */
/* On entry x is an approximation to the solution. */
/* On exit x is the current approximation. */
/* l is a double precision array of dimension n. */
/* On entry l is the lower bound of x. */
/* On exit l is unchanged. */
/* u is a double precision array of dimension n. */
/* On entry u is the upper bound of x. */
/* On exit u is unchanged. */
/* nbd is an integer array of dimension n. */
/* On entry nbd represents the type of bounds imposed on the */
/* variables, and must be specified as follows: */
/* nbd(i)=0 if x(i) is unbounded, */
/* 1 if x(i) has only a lower bound, */
/* 2 if x(i) has both lower and upper bounds, */
/* 3 if x(i) has only an upper bound. */
/* On exit nbd is unchanged. */
/* f is a double precision variable. */
/* On first entry f is unspecified. */
/* On final exit f is the value of the function at x. */
/* g is a double precision array of dimension n. */
/* On first entry g is unspecified. */
/* On final exit g is the value of the gradient at x. */
/* factr is a double precision variable. */
/* On entry factr >= 0 is specified by the user. The iteration */
/* will stop when */
/* (f^k - f^{k+1})/max{|f^k|,|f^{k+1}|,1} <= factr*epsmch */
/* where epsmch is the machine precision, which is automatically */
/* generated by the code. */
/* On exit factr is unchanged. */
/* pgtol is a double precision variable. */
/* On entry pgtol >= 0 is specified by the user. The iteration */
/* will stop when */
/* max{|proj g_i | i = 1, ..., n} <= pgtol */
/* where pg_i is the ith component of the projected gradient. */
/* On exit pgtol is unchanged. */
/* ws, wy, sy, and wt are double precision working arrays used to */
/* store the following information defining the limited memory */
/* BFGS matrix: */
/* ws, of dimension n x m, stores S, the matrix of s-vectors; */
/* wy, of dimension n x m, stores Y, the matrix of y-vectors; */
/* sy, of dimension m x m, stores S'Y; */
/* ss, of dimension m x m, stores S'S; */
/* yy, of dimension m x m, stores Y'Y; */
/* wt, of dimension m x m, stores the Cholesky factorization */
/* of (theta*S'S+LD^(-1)L'); see eq. */
/* (2.26) in [3]. */
/* wn is a double precision working array of dimension 2m x 2m */
/* used to store the LEL^T factorization of the indefinite matrix */
/* K = [-D -Y'ZZ'Y/theta L_a'-R_z' ] */
/* [L_a -R_z theta*S'AA'S ] */
/* where E = [-I 0] */
/* [ 0 I] */
/* snd is a double precision working array of dimension 2m x 2m */
/* used to store the lower triangular part of */
/* N = [Y' ZZ'Y L_a'+R_z'] */
/* [L_a +R_z S'AA'S ] */
/* z(n),r(n),d(n),t(n),wa(8*m) are double precision working arrays. */
/* z is used at different times to store the Cauchy point and */
/* the Newton point. */
/* sg(m),sgo(m),yg(m),ygo(m) are double precision working arrays. */
/* index is an integer working array of dimension n. */
/* In subroutine freev, index is used to store the free and fixed */
/* variables at the Generalized Cauchy Point (GCP). */
/* iwhere is an integer working array of dimension n used to record */
/* the status of the vector x for GCP computation. */
/* iwhere(i)=0 or -3 if x(i) is free and has bounds, */
/* 1 if x(i) is fixed at l(i), and l(i) .ne. u(i) */
/* 2 if x(i) is fixed at u(i), and u(i) .ne. l(i) */
/* 3 if x(i) is always fixed, i.e., u(i)=x(i)=l(i) */
/* -1 if x(i) is always free, i.e., no bounds on it. */
/* indx2 is an integer working array of dimension n. */
/* Within subroutine cauchy, indx2 corresponds to the array iorder. */
/* In subroutine freev, a list of variables entering and leaving */
/* the free set is stored in indx2, and it is passed on to */
/* subroutine formk with this information. */
/* task is a working string of characters of length 60 indicating */
/* the current job when entering and leaving this subroutine. */
/* iprint is an INTEGER variable that must be set by the user. */
/* It controls the frequency and type of output generated: */
/* iprint<0 no output is generated; */
/* iprint=0 print only one line at the last iteration; */
/* 0<iprint<99 print also f and |proj g| every iprint iterations; */
/* iprint=99 print details of every iteration except n-vectors; */
/* iprint=100 print also the changes of active set and final x; */
/* iprint>100 print details of every iteration including x and g; */
/* When iprint > 0, the file iterate.dat will be created to */
/* summarize the iteration. */
/* csave is a working string of characters of length 60. */
/* lsave is a logical working array of dimension 4. */
/* isave is an integer working array of dimension 23. */
/* dsave is a double precision working array of dimension 29. */
/* Subprograms called */
/* L-BFGS-B Library ... cauchy, subsm, lnsrlb, formk, */
/* errclb, prn1lb, prn2lb, prn3lb, active, projgr, */
/* freev, cmprlb, matupd, formt. */
/* Minpack2 Library ... timer, dpmeps. */
/* Linpack Library ... dcopy, ddot. */
/* References: */
/* [1] R. H. Byrd, P. Lu, J. Nocedal and C. Zhu, ``A limited */
/* memory algorithm for bound constrained optimization'', */
/* SIAM J. Scientific Computing 16 (1995), no. 5, pp. 1190--1208. */
/* [2] C. Zhu, R.H. Byrd, P. Lu, J. Nocedal, ``L-BFGS-B: FORTRAN */
/* Subroutines for Large Scale Bound Constrained Optimization'' */
/* Tech. Report, NAM-11, EECS Department, Northwestern University, */
/* 1994. */
/* [3] R. Byrd, J. Nocedal and R. Schnabel "Representations of */
/* Quasi-Newton Matrices and their use in Limited Memory Methods'', */
/* Mathematical Programming 63 (1994), no. 4, pp. 129-156. */
/* (Postscript files of these papers are available via anonymous */
/* ftp to eecs.nwu.edu in the directory pub/lbfgs/lbfgs_bcm.) */
/* * * * */
/* NEOS, November 1994. (Latest revision June 1996.) */
/* Optimization Technology Center. */
/* Argonne National Laboratory and Northwestern University. */
/* Written by */
/* Ciyou Zhu */
/* in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal. */
/* ************ */
/*< logical prjctd,cnstnd,boxed,updatd,wrk >*/
/*< character*3 word >*/
/*< >*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -