gpt4 book ai didi

c++ - 在 R 包中包含 TMB c++ 代码的指南

转载 作者:搜寻专家 更新时间:2023-10-31 01:30:03 27 4
gpt4 key购买 nike

我最近发现了 TMB 的神奇之处,并且我正在开发一个包,理想情况下,它会在其中包含 TMB c++ 模板,以用于计算成本相当高的模型。

我假设有可能:

  • 在包安装时自动编译 TMB 源代码

但我在 TMB 文档中找不到关于此的任何明确指南。截至目前,我的替代方案是编写在第一次调用使用未编译类的函数时编译 TMB 代码的函数……但我觉得有更好的方法可以做到这一点。

有没有人成功地将 TMB 功能包含在另一个包中,并能为我指明相关文档或示例的方向?

最佳答案

经过更多搜索,我终于在这个 thread 中找到了我的答案.我想我错过了它,因为它详细说明的决议已移至名为 development 的 wiki 页面,其中的内容专门针对希望为 TMB 的开发做出贡献的用户,而我只想分发代码其中包含 TMB。

总而言之,线程建议了一些我采纳的更改(myPkg 应该是您的包的名称):

来源/

  • 将您的.cpp 模板放在mypkg/src 中。这将在您构建包时由 R 自动编译。

描述

将这些行添加到您的描述文件中,以便 R 拥有编译模型模板所需的所有工具。

Depends: TMB, RcppEigen
LinkingTo: TMB, RcppEigen

R/roxygentags.r

现在我们需要将 TMB 模板添加到命名空间文件中。我们可以通过 roxygen 制作一个像这样的虚拟文件轻松地做到这一点:

#' Roxygen commands
#'
#' @useDynLib myPkg
#'
dummy <- function(){
return(NULL)
}

虚拟函数只是一个借口,可以在我的源代码中某处添加标签 @useDynLib myPkg,我不会弄乱它。此标记将使用 useDynLib(myPkg) 填充您的 NAMESPACE... 据我了解,这会在为您加载包时加载共享库。

调用包中的函数:

最后,调用MakeADFun时,设置DLL="myPkg"。使用此设置,您可以将单个 TMB 模型编译到您的包中。这是因为在你的./src/文件夹中编译的内容会根据你的包名自动重命名,因此你无法创建唯一命名的模型。

编辑:分发多个 DLL 的解决方案

经过更多搜索(与上面引用的线程相同)...我意识到官方 wiki 中描述的解决方案(以及上面详述的)仅与分发单个 dll(即单个 TMB 模型)相关。

如果您想在一个包中分发多个 TMB 模型,则必须使用您自己的 makefile。我已经给出了更详细的描述in my blog ,所以我在这里只简要描述这些步骤与我之前描述的步骤有何不同。

源文件/生成文件

你必须定义你自己的 Makefile(或 Makefile.win for windows 用户)并将它放在你的 src/ 目录中.这是一个对我有用的例子:

all: template1.so template2.so
# Comment here preserves the prior tab
template1.so: template1.cpp
Rscript --vanilla -e "TMB::compile('template1.cpp','-O0 -g')"
template2.so: template2.cpp
Rscript --vanilla -e "TMB::compile('template2.cpp','-O0 -g')"

clean:
rm -rf *o

对于 windows,将 so 替换为 dll,并使用相关的编译器标志(用于调试)。有关用于调试的编译器标志的信息,请参阅 ?TMB::compile

R/roxygentags.r

这与上面略有不同:

#' Roxygen commands
#'
#' This is a dummy function who's purpose is to hold the useDynLib roxygen tag.
#' This tag will populate the namespace with compiled c++ functions upon package install.
#'
#' @useDynLib template1
#' @useDynLib template2
#'
dummy <- function(){
return(NULL)
}

在包中使用您的模型

最后,上述更改将编译多个唯一命名的 TMB 模板并将它们加载到命名空间中。要在你的包中调用这些模型,这里有一个例子:

obj <- MakeADFun(data = data,
parameters = params,
DLL="template1",
inner.control = list(maxit = 10000),
silent=F)

提示...

当我尝试在 Windows 机器上编译它时遇到问题...结果证明与没有正确清理 src 文件夹有关,我有旧的 linux 编译文件卡在那里。如果您有编译问题,手动清除 src/ 目录中以前构建的残留文件是值得的……或者也许有人可以提供一些关于编写更好的 make 文件的好建议!

关于c++ - 在 R 包中包含 TMB c++ 代码的指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48627069/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com