在 C++ 中高效评估作为数据给出的任意函数
Efficient evaluation of arbitrary functions given as data, in C++
考虑以下目标:
创建一个程序来求解:minimize f(x)
作为输入提供的任意 f
和 x
。
如何设计一个 C++ 程序来接收 f
和 x
的描述并高效地处理它?
如果该程序实际上是一个 C++ 库,那么可以明确地为 f
和 x
编写代码(可能继承自 class 的一些基本函数 f
并为 x
声明 class)。
但是,如果程序是一项服务,并且用户正在以某种高级表示形式发送 f
和 x
的描述,例如一个 JSON 对象?
想到的想法
1- 将 f
转换为内部函数表示(例如基本操作列表)。每当评估 f
时应用那些。
问题:效率低下,除非每个操作都是批处理操作(例如,如果我们对大向量/矩阵进行向量或矩阵操作)。
2- 以某种方式生成 C++ 代码并编译用于表示 x
和计算 f
的代码。有没有一种方法可以限制编译,以便只需要编译该代码,但其余代码已经 'pre-compiled'?
mp library and others is to create an expression tree (or DAG) and use some kind of a nonlinear optimization 方法使用的常用方法,通常依赖于可以使用自动微分或数值微分计算的导数信息。
可以使用 generic visitor 模式有效地遍历表达式树以进行评估。使用 JIT 可能有点矫枉过正,除非评估函数所花费的时间占优化时间的很大一部分。
考虑以下目标:
创建一个程序来求解:minimize f(x)
作为输入提供的任意 f
和 x
。
如何设计一个 C++ 程序来接收 f
和 x
的描述并高效地处理它?
如果该程序实际上是一个 C++ 库,那么可以明确地为 f
和 x
编写代码(可能继承自 class 的一些基本函数 f
并为 x
声明 class)。
但是,如果程序是一项服务,并且用户正在以某种高级表示形式发送 f
和 x
的描述,例如一个 JSON 对象?
想到的想法
1- 将 f
转换为内部函数表示(例如基本操作列表)。每当评估 f
时应用那些。
问题:效率低下,除非每个操作都是批处理操作(例如,如果我们对大向量/矩阵进行向量或矩阵操作)。
2- 以某种方式生成 C++ 代码并编译用于表示 x
和计算 f
的代码。有没有一种方法可以限制编译,以便只需要编译该代码,但其余代码已经 'pre-compiled'?
mp library and others is to create an expression tree (or DAG) and use some kind of a nonlinear optimization 方法使用的常用方法,通常依赖于可以使用自动微分或数值微分计算的导数信息。
可以使用 generic visitor 模式有效地遍历表达式树以进行评估。使用 JIT 可能有点矫枉过正,除非评估函数所花费的时间占优化时间的很大一部分。