Пример для ast.NodeTransformer, который изменяет уравнение

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

Вот с чего я начинаю:

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)))

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

19
задан Bill the Lizard 13 August 2011 в 13:10
поделиться