从 optim.c 调用 BFGS 优化C++



所以我必须重写我的R代码才能C++。考虑到Rcpp一揽子计划,这是相对容易的。我在解决优化问题时遇到了一个问题。在 R 中,我调用:

optimum_optim = optim(par=A, fn=negative_LL, gr=negative_grad_LL, .c = c, .t = t, .i = i, .N = N, method = 'BFGS')

鉴于我已经将negative_LLnegative_grad_LL函数重写到我的C++文件中,我想从 R 调用 BFGS 优化的基础例程:它是 optim.c 的vmmin函数我
遇到了无法理解该函数签名的问题。是的:

vmmin(int n0, double *b, double *Fmin, optimfn fminfn, optimgr fmingr,
int maxit, int trace, int *mask,
double abstol, double reltol, int nREPORT, void *ex,
int *fncount, int *grcount, int *fail)

这并不是说我没有在搜索上付出任何努力 - 我只是找不到描述......有人可以在我的特定情况下帮助调用此函数(并告诉我参数是什么)?

听起来你已经在使用这个建议,但你需要更深入一点:"使用源代码,卢克"。

我的出发点是从 R 控制台简单地键入

optim

这将打印该函数的 R 源代码。在那里我看到它叫

.External2(C_optim, par, fn1, gr1, method, con, lower, upper)

我最喜欢的 R 源代码镜像是这个 GitHub 存储库。如果您前往那里,搜索"最佳",并仅过滤 C 结果,我们将转到顶部,src/library/stats/src/optim.c.然后我们可以看到 C 级optim()(第 177 行)函数如何调用vmmin()(第 295 行)。

初始化这些参数optim()方式如下

int n           length(par)
double *b       vect(npar); dpar[i] = REAL(par)[i] / (OS->parscale[i])
double *Fmin    0.0
optimfn fn      function defined in the C code
optimgr gr      function defined in the C code
int maxit       asInteger(getListElement(options, "maxit"))
int trace       asInteger(getListElement(options, "trace"))
int *mask       mask = (int *) R_alloc(npar, sizeof(int));
for (i = 0; i < npar; i++) mask[i] = 1;
double abstol   asInteger(getListElement(options, "abstol"))
double reltol   asInteger(getListElement(options, "reltol"))
int nREPORT     asInteger(getListElement(options, "REPORT"));
void *ex        OptStruct OS; /* tons of stuff done to this */
int *fncount    0
int *grcount    0
int *fail       0

我还没有在这里放所有的细节,但我相信这应该足以帮助你弄清楚你需要如何在你自己的函数中使用这些东西,一旦你发现了另一件事:optim()中的控制列表。如果您在上面的.External2()调用中注意到,则有一个名为con的参数。这在 R 代码中定义为

con <- list(trace = 0, fnscale = 1, parscale = rep.int(1, npar),
ndeps = rep.int(1e-3, npar),
maxit = 100L, abstol = -Inf, reltol = sqrt(.Machine$double.eps),
alpha = 1.0, beta = 0.5, gamma = 2.0,
REPORT = 10, warn.1d.NelderMead = TRUE,
type = 1,
lmm = 5, factr = 1e7, pgtol = 0,
tmax = 10, temp = 10.0)

尽管这些元素可以被control参数中的用户输入覆盖,并且如果您签出help("optim"),您将看到

"control"参数是一个列表,可以提供以下任何组件:">
    跟踪"...

C 函数通过名称options引用此列表,您在上面构建的表中多次引用了该名称。

最新更新