【问题标题】:Efficient evaluation of arbitrary functions given as data, in C++在 C++ 中对作为数据给出的任意函数进行有效评估
【发布时间】:2016-09-05 02:49:59
【问题描述】:

考虑以下目标:

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

如何设计一个可以接收fx 的描述并有效处理它的C++ 程序?

如果程序实际上是一个 C++ 库,那么可以显式地为fx 编写代码(可能从f 的某个基函数类和x 的状态类继承)。 但是,如果程序是例如服务,并且用户正在以某种高级表示形式发送fx 的描述,例如,应该怎么办? JSON 对象?

想到的想法 1- 将f 转换为内部函数表示(例如基本操作列表)。每当评估 f 时应用这些。 问题:效率低下,除非每个操作都是批处理操作(例如,如果我们正在使用大型向量/矩阵进行向量或矩阵运算)。

2- 以某种方式生成 C++ 代码并编译代码以表示 x 和计算 f。有没有办法限制编译,只需要编译该代码,但其余代码已经“预编译”?

【问题讨论】:

  • 使用嵌入式 JIT 编译器,例如 luajit?
  • 他们是怎么做的,我不知道,但它是在 Acado 工具包的 C++ 版本中完成的。 acado.github.io

标签: c++ optimization mathematical-optimization


【解决方案1】:

mp library 和其他人使用的常用方法是创建一个表达式树(或 DAG)并使用某种nonlinear optimization 方法,该方法通常依赖于可以使用自动或数值微分计算的导数信息。

可以使用generic visitor 模式有效地遍历表达式树以进行评估。除非评估函数所花费的时间占优化时间的很大一部分,否则使用 JIT 可能有点过头了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多