"""Representations for CFG-GP."""
from ... import _grammar
from ... import exceptions as _exceptions
from .. import _shared
_DT = _grammar.data_structures.DerivationTree
_LABEL = "CFG-GP"
[docs]class Genotype(_shared.representation.BaseGenotype):
"""CFG-GP genotype."""
__slots__ = ()
_label = _LABEL
[docs] def __init__(self, data):
"""Create a CFG-GP genotype with immutable data.
Parameters
----------
data : `~alogos._grammar.data_structures.DerivationTree`, or `str` representation of it
If the provided data is of type `str` it is automatically
converted to a tree.
Raises
------
GenotypeError
If the provided data can not be converted to the desired
form.
"""
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, _DT):
try:
if isinstance(data, str):
# JSON string to DerivationTree
dt = _DT(grammar=None)
dt.from_json(data)
data = dt
else:
raise TypeError
# Quick check
assert data.root_node
except Exception:
_exceptions.raise_cfggp_genotype_error(data)
return data
# Copying
[docs] def copy(self):
"""Create a deep copy of the genotype."""
return self.__class__(self.data.copy())
def __copy__(self):
"""Create a deep copy of the genotype."""
return self.__class__(self.data.copy())
def __deepcopy__(self, memo):
"""Create a deep copy of the genotype."""
return self.__class__(self.data.copy())
# Representation
def __str__(self):
"""Compute the "informal" string representation of the grammar."""
return str(self.data.to_json())
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 self.data.num_nodes()
[docs]class Individual(_shared.representation.BaseIndividual):
"""CFG-GP individual having a CFG-GP 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 population consisting of CFG-GP 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 "...")