【问题标题】:Passing R functions to C as C functions将 R 函数作为 C 函数传递给 C
【发布时间】:2015-03-18 15:20:27
【问题描述】:

背景

我正在编写一个包,在 R 中为各种预先指定的目标函数(要优化的函数)实现特定的优化算法。优化代码本身是用 C 编写的。为了使代码尽可能高效,我还用 C 重新实现了目标函数。现阶段 R 的作用是使用 .Call 为 C 代码提供接口.

目标

我希望包能够处理任何用户提供的目标函数。但是,我不想从 C 中调用 R 函数,这会产生很大的开销,而且很可能会非常缓慢。

我真正想要的是一种将有限类别的 R 函数(在统计和机器学习中通常视为成本函数)作为参数传递的方法,将此 R 函数转换为 C 函数 然后在优化算法中用作目标函数。

解决方案

R 与 LISP 有着深厚的关系。获取函数的抽象语法树 (AST) 非常简单。我在想可能可以将 AST 解析为 C 函数,然后编译它或动态传递它(我不知道这在 C 中是否可行)

问题

  • 上面的解决思路是否可行?
  • 还有其他方法可以做到这一点吗?
  • 我必须学习什么才能做到这一点?

注意:不需要将其作为 R 包进行。尝试在 R 包的刚性结构中执行此操作可能会使事情变得更加困难。

【问题讨论】:

  • 看这个例子如何从C调用R:gist.github.com/Sharpie/323498
  • 谢谢。是的,我知道。但这不是我想要的。我不想从 C 中调用 R 函数。我想将 R 函数转换为 C 函数。
  • 我不认为从 C 调用 R 有很大的开销。每次在 R 中执行一行时,您都在调用某个 C 函数。但是,我认为您的要求通常不可行且有效。如果是这样,每个 R 函数都将在 C 中翻译,然后在 R 中,您只需使用简单的包装器即可调用 C 函数。
  • 由于 R 目标函数会很慢并且在优化过程中调用数千次,因此存在固有的巨大开销。至于效率,这种方法在几个python包中实现得非常成功(例如在Theano中)
  • 好的,为这样的东西编写一个正式的规范,然后你应该能够弄清楚是否可以将其转码为 C 或 C++,然后使用 Rcpp 动态加载它。学习 C 或 C++ 可能更容易。

标签: c++ c r compilation abstract-syntax-tree


【解决方案1】:

之前实验的一些提示:

  • R to C compiler at Rice: 放弃

  • R to C compiler by Simon:也过时了。

  • Duncan Temple Lang 的 R 和 LLVM 尝试:有两个包和一篇已发表的论文,但(似乎)没有人使用它。自从我阅读这篇论文已经有一段时间了,但一个限制是它甚至没有试图涵盖所有的 R。

您不能轻易做到这一点的原因之一是这些语言擅长计算语言以及非标准评估与标准评估、承诺、强制评估等。

最后,对于将编译后的目标函数传递给优化器的狭隘情况:请参阅我的RcppDE package。

请乔希提醒一下西蒙的尝试。

【讨论】:

  • Renjin 将相当大的 R 代码编译为 Java 以获得合理的性能(有人告诉我)。与理解编译 R 的挑战相关,但显然与 C 和原始问题无关。不知何故,“本机”C/C++ 代码似乎应该很容易通过 JNI 处理,但我想那是扶手椅编程。
  • 它不能处理Rcpp,所以它的反向依赖有点深远,它排除了大量的CRAN。
  • 感谢您的解释和参考。但是,我要问的范围要有限得多。如果可能的话,如何编写一个数学表达式编译器,将 R 数学表达式转换为 C。如果可以做到这一点,我下一步将研究 RcppDE 代码以了解如何封装和传递外部将指向已编译 C 函数的指针封装到 C 优化器的指针对象。
猜你喜欢
  • 2015-06-09
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
相关资源
最近更新 更多