Source code for geppy.tools.parser
# coding=utf-8
"""
.. moduleauthor:: Shuhua Gao
This module :mod:`parser` provides functionality for compiling an individual (a chromosome) in GEP into an executable
lambda function in Python for subsequent fitness evaluation.
.. todo::
Parse an individual into codes of other languages, such as C++/Java, for deployment in an industrial environment.
"""
import sys
def _compile_gene(g, pset):
"""
Compile one gene *g* with the primitive set *pset*.
:return: a function or an evaluated result
"""
code = str(g)
if len(pset.input_names) > 0: # form a Lambda function
args = ', '.join(pset.input_names)
code = 'lambda {}: {}'.format(args, code)
# evaluate the code
try:
return eval(code, pset.globals, {})
except MemoryError:
_, _, traceback = sys.exc_info()
raise MemoryError("The expression tree generated by GEP is too deep. Python cannot evaluate a tree higher "
"than 90. You should try to adopt a smaller head length for the genes, for example, by using"
"more genes in a chromosome.").with_traceback(traceback)
[docs]def compile_(individual, pset):
"""
Compile the individual into a Python lambda expression.
:param individual: :class:`Chromosome`, a chromosome
:param pset: :class:`PrimitiveSet`, a primitive set
:return: a function if the primitive set *pset* has any inputs (arguments), which can later be called with
specific parameter values; otherwise, a numerical result obtained from evaluation.
"""
fs = [_compile_gene(gene, pset) for gene in individual]
linker = individual.linker
if linker is None:
if len(fs) == 1:
return fs[0]
else:
return lambda *x: tuple((f(*x) for f in fs))
return lambda *x: linker(*(f(*x) for f in fs))
__all__ = ['compile_']