在 C++ 中高效评估作为数据给出的任意函数

Efficient evaluation of arbitrary functions given as data, in C++

考虑以下目标:

创建一个程序来求解:minimize f(x) 作为输入提供的任意 fx

如何设计一个 C++ 程序来接收 fx 的描述并高效地处理它?

如果该程序实际上是一个 C++ 库,那么可以明确地为 fx 编写代码(可能继承自 class 的一些基本函数 f并为 x 声明 class)。 但是,如果程序是一项服务,并且用户正在以某种高级表示形式发送 fx 的描述,例如一个 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 可能有点矫枉过正,除非评估函数所花费的时间占优化时间的很大一部分。