principal
nivel superior
enviar artículo
buscar
administrar
acerca de ...
rdf
rss
main
|
Parser de CAML ... la historia continua |
|
|
|
Posted by David Suarez on Wednesday September 28, @01:56AM el 2005
from the Santos reptiles Guido! dept.
Para los que no lo sepan (o no lo recuerden), estoy trabajando en un intérprete programado en Python de CAML (cellular automata modelling language). A continuación los avances más recientes ...
La última versión "estable" del parser ya era capaz de representar e interpretar las reglas a través de una estructura jerárquica y de evaluación recursiva. Las principales ventajas de tener este tipo de estructura, a pesar de la lentitud que implica son las siguientes:
- La estructura se puede modificar en tiempo de ejecución.
- Para cada cambio pueden evaluarse las reglas para verificar que no generen errores.
- Esto permitiría utilizar técnicas de programación evolutiva para obtener algoritmos que cumplan con ciertas restricciones definidas y sean óptimos.
Los cambios más recientes agregan la posiblidad de transformar automáticamente la estructura jerárquica en código de Python que puede ser compilado y evaluado en tiempo de ejecución, acelerando la evaluación de un algoritmo particular. En teoría esta capacidad podría extenderse para abarcar otros lenguajes, ¿C, Java?
Si bien el código generado no es muy legible, debe funcionar. A continuación dos ejemplos del código generado:
Sierpinsky:
reduce(operator.and_, [reduce(operator.and_, [reduce(operator.or_, [cmp(2.000000,sum([grid.get(map(operator.add, address, (1, 0, 0))), grid.get(map(operator.add, address, (0, 0, 0))), grid.get(map(operator.add, address, (-1, 0, 0)))])) == 0, cmp(1.000000,sum([grid.get(map(operator.add, address, (1, 0, 0))), grid.get(map(operator.add, address, (0, 0, 0))), grid.get(map(operator.add, address, (-1, 0, 0)))])) == 0])])]) and 1.000000 or 0.000000
Game of life:
reduce(operator.and_, [reduce(operator.and_, [reduce(operator.or_, [cmp(3.000000,sum([grid.get(map(operator.add, address, (1, 1, 0))), grid.get(map(operator.add, address, (0, 1, 0))), grid.get(map(operator.add, address, (-1, 1, 0))), grid.get(map(operator.add, address, (1, 0, 0))), grid.get(map(operator.add, address, (-1, 0, 0))), grid.get(map(operator.add, address, (1, -1, 0))), grid.get(map(operator.add, address, (0, -1, 0))), grid.get(map(operator.add, address, (-1, -1, 0)))])) == 0, cmp(2.000000,sum([grid.get(map(operator.add, address, (1, 1, 0))), grid.get(map(operator.add, address, (0, 1, 0))), grid.get(map(operator.add, address, (-1, 1, 0))), grid.get(map(operator.add, address, (1, 0, 0))), grid.get(map(operator.add, address, (-1, 0, 0))), grid.get(map(operator.add, address, (1, -1, 0))), grid.get(map(operator.add, address, (0, -1, 0))), grid.get(map(operator.add, address, (-1, -1, 0)))])) == 0]), cmp(1.000000,grid.get(address)) == 0])]) and 1.000000 or 0.000000
¿Qué falta?, pues varias cosas:
Implementar el elemento Pattern, que está talachudo, y que no parece muy adecuado pensando en trabajar con autómatas de más de dos dimensiones.
Agregar validación para checar que la modificación de la estructura cumpla con las especificaciones.
Integrar algún tipo de rejilla(grid), ya sea el de CAGE, el de Birdcage o algún otro.
Implementar la construcción del mapa a partir de las definición de topología formulada a partir de la propuesta de Vian.
Plantearle al autor de CAML algunas mejoras al lenguaje.
Pruebas extensivas.
Etc.
Para checar el código:
cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/ouroborus login
cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/ouroborus co -P PyCAML
<
SE LES CONVOCA A TODOS A UNA REUNION DE TRABAJO CON LA MTRA. MARCELA SANTILLÁN EL VIERNES 30 DE SEPTIEMBRE A LAS 18:30 HORAS EN LA RECTORIA
|
Una razon mas para cambiar a Linux
>
|
|