Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/math/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 数学问题的代码生成_Math_F#_Code Generation_Ocaml - Fatal编程技术网

Math 数学问题的代码生成

Math 数学问题的代码生成,math,f#,code-generation,ocaml,Math,F#,Code Generation,Ocaml,我想写一个程序,在一个数学(优化)问题的描述,解析它,并生成紧凑,高效的C代码来解决它。我有一个针对python中一个小得多、更具体的问题的黑客解决方案,但它很难看,而且只依赖于C代码模板——所以我有一大堆看起来像 for(k=0;k不知道更简单。建议你看看现有的数学建模工作。我不认为这是简单的;解算器代码已经够难了,生成它们更难 您需要指定问题细节的方法,以及组装由这些细节控制的答案部分的方法 我建议: ,一个生成数学建模代码的系统;本文讨论如何组织知识并支持生成有限差分代码 及 ,麻省理工学

我想写一个程序,在一个数学(优化)问题的描述,解析它,并生成紧凑,高效的C代码来解决它。我有一个针对python中一个小得多、更具体的问题的黑客解决方案,但它很难看,而且只依赖于C代码模板——所以我有一大堆看起来像


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