Пример для ast.NodeTransformer, который изменяет уравнение - PullRequest
19 голосов
/ 17 июня 2011

Это продолжение моего последнего вопроса. Я хочу разобрать уравнение и поработать над тем, что я получу. То, что я хочу сделать, это в основном случайное шифрование, чтобы я получил новое уравнение, которое также должно быть действительной функцией. Это должно быть использовано в генетическом алгоритме.

Вот с чего я начну:

class Py2do(ast.NodeTransformer):
def __init__(self):
  self.tree=[]
def generic_visit(self, node):
    print type(node).__name__
    self.tree.append(type(node).__name__)
    ast.NodeVisitor.generic_visit(self, node)
    depth=3
    s = node.__dict__.items()
    s = "    ".join("%s %r" % x for x in sorted(node.__dict__.items()))
    print( "%s%s\t%s" % (depth, str(type(node)), s) )
    for x in ast.iter_child_nodes(node):
      print (x, depth)

def visit_Name(self, node):
    # print 'Name :', node.id
    pass

def visit_Num(self, node):
    print 'Num :', node.__dict__['n']

def visit_Str(self, node):
    print "Str :", node.s

def visit_Print(self, node):
    print "Print :"
    ast.NodeVisitor.generic_visit(self, node)

def visit_Assign(self, node):
    print "Assign :"
    ast.NodeVisitor.generic_visit(self, node)

def visit_Expr(self, node):
    print "Expr :"
    ast.NodeVisitor.generic_visit(self, node)





if __name__ == '__main__':
    node = ast.parse("res= e**(((-0.5*one)*((delta_w*one/delta*one)**2)))")
    import ast_pretty
    print ast.dump(node)
    pprintAst(node)
    v = Py2do()
    v.visit(node)
    print v.tree

То, что я хочу получить, выглядит примерно так:

res= e**(delta*((one/delta_w*one)**2)))

или другое действительное случайное уравнение некоторого вида. Это будет использоваться в программе на Фортране, поэтому было бы неплохо, если бы полученное уравнение также можно было перенести в Фортран. Пожалуйста, прокомментируйте свой код и предоставьте тестовый образец / модульный тест.

Ответы [ 2 ]

1 голос
/ 21 августа 2011

То есть вход и выход являются кодом Фортрана? И вы хотите использовать произвольные выражения / операторы Фортрана? (Включая фрагменты массива, ...?) Фортран - довольно сложный язык; для его прочтения требуется полный анализатор.

Возможно, вы хотите использовать инструмент преобразования программ, который уже может напрямую управлять Фортраном. Такой инструмент будет читать код на Фортране, создавать AST, позволять вам «рандомизировать» его, используя набор случайно выбранных преобразований, а затем восстанавливать действительный код на Фортране.

Наш инструментарий реинжиниринга программного обеспечения DMS с его интерфейсом Fortran может использоваться непосредственно для этого.

РЕДАКТИРОВАТЬ 26 августа 2011: ОП подтверждает, что он хочет «развить» (преобразовать) реальный код Фортрана. Стоит отметить, что создать настоящий синтаксический анализатор на Фортране (например, создание синтаксических анализаторов для любого другого реального языка) довольно сложно; нам потребовались месяцы, и наши инструменты действительно хороши в определении синтаксических анализаторов (мы сделали около 40 языков и различных диалектов, используя DMS). Возможно, для него не очень хорошая идея создать свой собственный настоящий синтаксический анализатор Фортрана, по крайней мере, если он хочет продолжить свою жизнь или свою реальную задачу.

Для OP может быть возможно ограничить код Фортрана очень ограниченным подмножеством и создать для этого парсер.

0 голосов
/ 24 июня 2011

Что вы пытаетесь сделать?Поиск правильной перестановки уравнения может быть простым, но отнимает много времени (n! Возможностей), но генерация новых и оптимизация тех, которые используют генетический алгоритм, невозможна, потому что это не проблема оптимизации ... Например, x ^0,00 и х ^ 0,01 принципиально разные.Кроме того, вы не можете оптимизировать для нужного оператора, который просто не будет работать.Извините.

Хотя, ситуация не так уж и плоха.Поиск правильной функции является чрезвычайно распространенной задачей.Теперь я предполагаю, что вы не знаете функцию, но вы знаете пару точек из измерений (вам все равно понадобилось бы это для расчета пригодности в вашем генетическом алгоритме, не так ли?).Теперь вы можете использовать Лагранжа , чтобы получить многочлен, который проходит эти заданные точки.В середине статьи в википедии есть два хороших примера, и lagrange довольно легко реализовать (я думаю, <10 строк кода).Также обратите внимание, что у вас есть возможность повысить точность полинома, просто добавив больше опорных точек. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...