【发布时间】:2018-12-21 08:02:28
【问题描述】:
我正在寻找一个通用的、惰性求值式的程序来简化我的代码。
现在,我有能力加快数学函数的执行速度——前提是我先调用另一个方法对其进行预处理。更具体地说,给定一个类型的函数:
const Eigen::MatrixXd<double, -1, -1> function_name(const Eigen::MatrixXd<double, -1, -1>& input)
我可以把它传递给另一个函数g,它会产生一个新版本的function_nameg_p,可以更快地执行。
我想将所有这些忙碌的工作从最终用户手中抽离出来。理想情况下,我想创建一个类,这样当在任何输入(例如,x)上调用与 function_name 的方法签名匹配的任何函数 f 时,会发生以下情况:
- 该类检查之前是否调用过
f。 - 如果没有,则调用
g(f),然后调用g_p(x)。 - 如果有,它只会调用
g_p(x)
这很棘手,原因有两个。首先,我不知道如何获取对当前方法的引用,或者是否可能,并将其传递给g。可能有办法解决这个问题,但将一个函数传递给另一个函数对我来说是最简单/最干净的。
第二个更大的问题是如何强制调用g。我已经阅读了execute around pattern 的相关信息,它几乎可以用于此目的 - 除非我理解错误,否则无法在周围的函数调用中引用 f。
有什么方法可以干净利落地实现我的梦想课程?理想情况下,我希望最终超越function_name 的类型(可能使用模板),但可以一次迈出这一步。我也愿意接受其他解决方案来获得相同的功能。
【问题讨论】:
-
我不认为我完全理解你在做什么。
g是一个函数,它接受一个函数指针并返回另一个函数指针?您如何/在何处/何时“生成新版本”的函数? -
没错。 g 是一个函数,它接受指向 f 的指针,并生成 f 的新优化版本 g_p,然后将其存储在某个地方。为了清楚起见,也许我应该调用 g_p f_p。
-
我认为你需要给我们一个你在说什么的例子(然后 ping 我)。谢谢。
-
如前所述,显而易见的问题是“在这种情况下,惰性评估有什么好处?”然而,我的直觉是你试图实现类似于旧 C++ 库 newmat robertnz.net/nm_intro.htm 的东西,即你想延迟评估 f 以便在某些情况下 g(f(x)) 被优化的 g_and_f( x) 改为;作为 g(f(x)) 的有效替代,惰性评估旨在解决这个问题。如果是这种情况,可能会有更好的解决方案。
-
您希望用户如何使用您的课程?
obj->invoke(f, x)可以接受吗?
标签: c++ eigen lazy-evaluation idioms