Math 数学问题的代码生成
我想写一个程序,在一个数学(优化)问题的描述,解析它,并生成紧凑,高效的C代码来解决它。我有一个针对python中一个小得多、更具体的问题的黑客解决方案,但它很难看,而且只依赖于C代码模板——所以我有一大堆看起来像Math 数学问题的代码生成,math,f#,code-generation,ocaml,Math,F#,Code Generation,Ocaml,我想写一个程序,在一个数学(优化)问题的描述,解析它,并生成紧凑,高效的C代码来解决它。我有一个针对python中一个小得多、更具体的问题的黑客解决方案,但它很难看,而且只依赖于C代码模板——所以我有一大堆看起来像 for(k=0;k不知道更简单。建议你看看现有的数学建模工作。我不认为这是简单的;解算器代码已经够难了,生成它们更难 您需要指定问题细节的方法,以及组装由这些细节控制的答案部分的方法 我建议: ,一个生成数学建模代码的系统;本文讨论如何组织知识并支持生成有限差分代码 及 ,麻省理工学
for(k=0;k不知道更简单。建议你看看现有的数学建模工作。我不认为这是简单的;解算器代码已经够难了,生成它们更难
您需要指定问题细节的方法,以及组装由这些细节控制的答案部分的方法
我建议:
,一个生成数学建模代码的系统;本文讨论如何组织知识并支持生成有限差分代码
及
,麻省理工学院的一篇论文也是这样写的
(我在Sinapse系统的初始开发过程中参与过该系统)。听起来您需要类似符号计算的东西。请查看以下一些实现:
一般来说,试着看看优化包,很多都支持某种符号表示法。我不知道你在优化方面有多少背景,但我怀疑你所描述的路径是正确的。特别是,如果你能编写高效的C代码来解决优化问题,我会感到惊讶,除非你是有限制的优化通常区分不同类型的问题(线性与非线性、整数与连续与混合整数规划),每个问题通常使用非常不同的算法来解决
您可能想了解一些想法。基本上,MSF是一个通用API,它允许您以多种形式声明问题(OML,一种用于指定优化问题的声明性语言,但也包括C#和F#),然后根据问题的性质将问题反馈给相应的解算器。您正在尝试实现编译器,这就是解决问题的方法。有一种输入语言描述您的优化问题,而输出语言是C
您可以将问题分解为以下任务(不一定按此顺序解决):
设计一个数据结构,表示输入语言的
设计一个表示输出语言抽象语法的数据结构,在您的例子中,它是C的(子集)
输入语言的设计
实现一个lexer和一个解析器,将具体语法转换为抽象语法
实现一个漂亮的打印机,将输出语言的抽象语法转换为具体语法
实现一个编译器,该编译器将一个优化问题(用抽象语法表示)引入到输出中,并再次用抽象语法表示
如果你不习惯使用语言和编译器,你会尝试使用捷径。例如,你可能会考虑使用正则表达式进行解析。或者你可能认为跳过抽象语法是一个好主意,只是直接生成C源。我强烈反对这个。抽象是你的朋友,因为它是WIL。我会处理好你的问题
您应该仔细选择实现整个过程所用的语言。当然,像Ocaml这样的语言非常适合这项工作。但是如果您还不了解Ocaml,您应该坚持使用您最熟悉的语言。您不应该尝试手动实现解析器,因为有大量的解析器生成器可供选择这里。值得学习一个。你可能会发现我的帮助
给定这样一种类型:
type Expr =
| Int of int
| Var of string
| Leq of Expr * Expr
| Mul of Expr * Expr
| Div of Expr * Expr
| Set of string * Expr
| SetElt of Expr * Expr * Expr
| GetElt of Expr * Expr
| For of string * Expr * Expr * Expr
我编写了一个非常简单的高级VM,名为HLVM,您可能会发现它很有启发性,因为它以一种简单的方式使用了这种表示
这种表示法比字符串搜索功能强大得多,因为模式匹配编译器为您执行穷尽性和冗余检查,使您可以轻松地在这种Expr
类型的值上编写函数,包括优化过程和代码生成器。如果可以,请掌握。它会给您带来好主意!您可以这样说“所以我想我要找的是关于如何在代码中表示这类问题的高级建议,……”,但你从来没有真正描述过“这类问题”是什么。最接近的是“阶段”数学(优化)问题",而作为一名数学家,这几乎没有告诉我你正在尝试做什么。因此,请提供一个更具体的描述,说明你试图用代码生成器解决什么类型的问题。示例将非常有用。@rbaryyoung我正在尝试最大化一个函数,并且存在约束。我不觉得细节真的很重要-我正在从做过或考虑过这类工作的人那里寻求高层结构建议。@alex“我觉得细节真的不重要”。细节几乎肯定很重要。例如,您引用了一行代码,如果循环很短,编译器可以展开该行代码;如果循环很长,则可以使用不同的内存访问模式来改善空间和时间局部性;如果循环的性能不显著,则编译器可能不想编译该行代码o C.@alex很难在你试图表达什么的信息如此之少的情况下提出表达。我正在解决一类相当具体的问题,我对它足够熟悉,可以编写处理特殊情况的合理有效的代码。谢谢你的参考-第一个已经死了;你有其他URL吗?我搞砸了冷杉
For("k", Int 0, Leq(Var "k", a), Set("k", Add(Var "k", b)),
SetElt(Var "a", Var "k",
Mul(Div(GetElt(Var "v", Var "k"), c, GetElt(Var "a", Var "i")))))
type Expr =
| Int of int
| Var of string
| Leq of Expr * Expr
| Mul of Expr * Expr
| Div of Expr * Expr
| Set of string * Expr
| SetElt of Expr * Expr * Expr
| GetElt of Expr * Expr
| For of string * Expr * Expr * Expr