发布于 2015-06-06 14:23:35
我最近用Python为AMPL的一个子集编写了一个解析器,它是可用的这里。它是不完整的,但已经可以处理许多AMPL表达式,可以很容易地扩展。
下面是将目标函数从AMPL转换为Python的示例:
import ampl, sys
class AMPLToPythonConverter:
def __init__(self, stream):
self.stream = stream
def visit_reference(self, expr):
self.stream.write(expr.name)
def visit_binary(self, expr):
expr.lhs.accept(self)
self.stream.write(' {} '.format(expr.op))
expr.rhs.accept(self)
def visit_decl(self, decl):
if decl.kind == 'minimize':
self.stream.write("def {}(x):\n".format(decl.name))
self.stream.write(" return ");
decl.body.accept(self)
self.stream.write('\n')
compound_stmt = ampl.parse(
"""
var x;
minimize f: x * x;
""", "input")
for node in compound_stmt.nodes:
node.accept(AMPLToPythonConverter(sys.stdout))
运行此代码将打印:
def f(x):
return x * x
为了保持简单,示例硬编码参数名x
,但是可以从AST派生它。
https://stackoverflow.com/questions/30666785
复制