Source code for yggdrasil.communication.transforms.StatementTransform
import numpy as np
from yggdrasil import units
from yggdrasil.tools import safe_eval
from yggdrasil.communication.transforms.TransformBase import TransformBase
[docs]class StatementTransform(TransformBase):
r"""Class for transforming messages based on a provided statement using Python syntax.
Args:
statement (str): Python statement in terms of the message as represented by
the string "%x%" that should evaluate to the transformed message.
The statement should only use a limited set of builtins and the math
library (See yggdrasil.tools.safe_eval). If more complex relationships
are required, use the FunctionTransform class.
Attributes:
statement (str): Python statement that will be evaluated to transform
messages.
"""
_transformtype = 'statement'
_schema_required = ['statement']
_schema_properties = {'statement': {'type': 'string'}}
_schema_subtype_description = "Transform messages according to a statement"
def __init__(self, *args, **kwargs):
super(StatementTransform, self).__init__(*args, **kwargs)
self.statement = self.statement.replace('%x%', 'x')
[docs] def evaluate_transform(self, x, no_copy=False):
r"""Call transform on the provided message.
Args:
x (object): Message object to transform.
no_copy (bool, optional): If True, the transformation occurs in
place. Otherwise a copy is created and transformed. Defaults
to False.
Returns:
bool: True if the message will pass through the transform, False otherwise.
"""
return safe_eval(self.statement, x=x)
[docs] @classmethod
def get_testing_options(cls, **kwargs):
r"""Get testing options for the transform class.
Returns:
list: Multiple dictionaries of keywords and messages before/after
pairs that will result from the transform created by the provided
keywords.
"""
out = [{'kwargs': {'statement': '%x%**3'},
'in/out': [(1, 1), (2, 8)]},
{'kwargs': {'statement': '%x% * array([1, 1, 1])'},
'in/out': [(1, np.ones(3, int)), (2, 2 * np.ones(3, int))]},
{'kwargs': {'statement': '%x% * '
+ repr(units.add_units(1.0, 'cm'))},
'in/out': [(1.0, units.add_units(1.0, 'cm')),
(2.0, units.add_units(2.0, 'cm'))]},
{'kwargs': {'statement': '%x%**3'},
'in/out': [(iter([1, 2]), iter([1, 8]))]}]
return out