Source code for alogos.systems.cfggpst.representation

"""Representations for CFG-GP-ST."""

from ... import _grammar
from ... import exceptions as _exceptions
from .. import _shared


_LABEL = "CFG-GP-ST"


[docs]class Genotype(_shared.representation.BaseGenotype): """CFG-GP-ST genotype.""" __slots__ = () _label = _LABEL
[docs] def __init__(self, data): """Create a CFG-GP-ST genotype with immutable data. Parameters ---------- data : `~alogos._grammar.data_structures.DerivationTree`, or `tuple` representation of it, or `str` representation of it If the provided data is of type `tuple` or `str` it is automatically converted to a tree. Raises ------ GenotypeError If the provided data can not be converted to the desired form. """ # Immutable data attribute object.__setattr__(self, "data", self._convert_input(data))
def _convert_input(self, data): """Convert different genotype formats to a single one.""" if not isinstance(data, tuple) or not data: try: if isinstance(data, str): # String to tuple data = eval(data) if not isinstance(data, tuple): data = (tuple(data[0]), tuple(data[1])) elif isinstance(data, list): # List to tuple data = (tuple(data[0]), tuple(data[1])) elif isinstance(data, _grammar.data_structures.DerivationTree): # DerivationTree to tuple from . import mapping as _mapping data = _mapping.reverse(data.grammar, data).data else: raise TypeError # Quick check assert isinstance(data[1][0], int) except Exception: _exceptions.raise_cfggpst_genotype_error(data) return data # Representation def _repr_pretty_(self, p, cycle): """Provide rich display representation for IPython and Jupyter.""" p.text(str(self) if not cycle else "...") # Length def __len__(self): """Calculate the length of the genotype.""" return len(self.data[0])
[docs]class Individual(_shared.representation.BaseIndividual): """CFG-GP-ST individual having a CFG-GP-ST genotype.""" __slots__ = () _label = _LABEL def _repr_pretty_(self, p, cycle): """Provide rich display representation for IPython and Jupyter.""" p.text(str(self) if not cycle else "...")
[docs]class Population(_shared.representation.BasePopulation): """CFG-GP-ST population consisting of CFG-GP-ST individuals.""" __slots__ = () _label = _LABEL def _repr_pretty_(self, p, cycle): """Provide rich display representation for IPython and Jupyter.""" p.text(str(self) if not cycle else "...")
def _find_subtree_end(s, cnt): """Find index of the last symbol in a subtree. This method is used by crossover and mutation operators. """ c = cnt[s] while c: s += 1 n = cnt[s] if n == 0: c -= 1 elif n > 1: c += n - 1 return s