Esta es la continuación de mi última pregunta. Quiero analizar una ecuación y trabajar en lo que obtengo. Lo que quiero hacer es básicamente aleatorizarlo para que obtenga una nueva ecuación, que también tiene que ser una función válida. Esto se usará en un algoritmo genético.Ejemplo para ast.NodeTransformer que muta una ecuación
Aquí es donde comienzo:
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
Lo que yo quiero salir es algo como esto:
res= e**(delta*((one/delta_w*one)**2)))
u otra ecuación aleatoria válida de algún tipo. Esto se usará en un programa Fortran, por lo que sería bueno si la ecuación resultante también se puede transferir a Fortran. Por favor comente su código y proporcione una prueba de prueba/unidad de prueba.
creo que debe marcar nodos de expresión con su tipo adecuado, por ejemplo, asociativo, binario, monario, etc. Luego puede codificar el árbol según el tipo de operadores para mantener la coherencia. – Chiguireitor
no es tan fácil acceder a los nodos del árbol.si tuviera eso sería un gran paso adelante. – tarrasch
Pero ya has hecho un patrón de "visitante" allí ... puedes clonar el árbol y luego mutarlo en consecuencia. – Chiguireitor