diff --git a/mapytex/calculus/API/expression.py b/mapytex/calculus/API/expression.py index 19a7808..282f67d 100644 --- a/mapytex/calculus/API/expression.py +++ b/mapytex/calculus/API/expression.py @@ -11,6 +11,8 @@ Expression """ from ..core import AssocialTree, Tree, compute, typing, TypingError +from ..core.random import extract_rdleaf, extract_rv, random_generator, compute_leafs, replace_rdleaf +from ..core.MO import moify from .tokens import factory from .renders import renders @@ -68,25 +70,60 @@ class Expression(object): """ t = Tree.from_str(string) if typing: - tt = cls(t)._typing() - try: - return factory(tt) - except TypeError as e: - return cls(t) + return cls._post_precessing(t) return cls(t) @classmethod - def random(self, template, conditions=[], shuffle=False): - """ Initiate randomly the expression + def random( + cls, + template, + conditions=[], + rejected=[0], + min_max=(-10, 10), + variables_scope={}, + shuffle=False, + ): + """ Initiate randomly the expression :param template: the template of the expression :param conditions: conditions on randomly generate variable + :param rejected: Values to reject for all random variables + :param min_max: Min and max value for all random variables + :param variables_scope: Dictionnary for each random varaibles to fic rejected and min_max :param shuffle: allowing to shuffle the tree :returns: TODO + :example: + >>> Expression.random("{a}/{a*k}") # doctest: +SKIP + + >>> Expression.random("{a}/{a*k} - 3*{b}", variables_scope={'a':{'min_max':(10, 30)}}) + + """ - pass + rd_t = Tree.from_str(template, random=True) + leafs = extract_rdleaf(rd_t) + rd_varia = extract_rv(leafs) + generated = random_generator( + rd_varia, conditions, rejected, min_max, variables_scope + ) + computed = compute_leafs(leafs, generated) + t = replace_rdleaf(rd_t, computed).map_on_leaf(moify) + t = cls._post_precessing(t) + + if shuffle: + raise NotImplemented("Can't suffle expression yet") + + return cls(t) + + @classmethod + def _post_precessing(cls, t): + """ Post process the tree by typing it """ + tt = cls(t)._typing() + try: + return factory(tt) + except TypeError as e: + return cls(t) @classmethod def set_render(cls, render): diff --git a/mapytex/calculus/core/random/leaf.py b/mapytex/calculus/core/random/leaf.py index 802bd17..471ed4b 100644 --- a/mapytex/calculus/core/random/leaf.py +++ b/mapytex/calculus/core/random/leaf.py @@ -31,6 +31,7 @@ def look_for_rdleaf(target): except TypeError: target_ = target + stacking = False try: while True: tok = yield diff --git a/mapytex/calculus/core/tree.py b/mapytex/calculus/core/tree.py index b7a1737..3b38e4f 100644 --- a/mapytex/calculus/core/tree.py +++ b/mapytex/calculus/core/tree.py @@ -11,7 +11,7 @@ Tree class from .tree_tools import to_nested_parenthesis, postfix_concatenate, show_tree from .coroutine import coroutine, STOOOP -from .str2 import str2 +from .str2 import str2, rdstr2 from .operator import OPERATORS, is_operator __all__ = ["Tree", "MutableTree"] @@ -51,7 +51,7 @@ class Tree: self.right_value = right_value @classmethod - def from_str(cls, expression, convert_to_mo=True): + def from_str(cls, expression, convert_to_mo=True, random=False): """ Initiate a tree from an string expression :example: @@ -77,9 +77,17 @@ class Tree: > * | > 3 | > n + >>> t = Tree.from_str("2+{n}*x", random=True) + >>> print(t) + + + > 2 + > * + | > {n} + | > x + """ - t = MutableTree.from_str(expression, convert_to_mo) + t = MutableTree.from_str(expression, convert_to_mo, random) return cls.from_any_tree(t) @classmethod @@ -890,7 +898,7 @@ class MutableTree(Tree): self.right_value = right_value @classmethod - def from_str(cls, expression, convert_to_mo=True): + def from_str(cls, expression, convert_to_mo=True, random=False): """ Initiate the MutableTree :example: @@ -948,8 +956,12 @@ class MutableTree(Tree): | > x """ - str_2_mut_tree = str2(cls.sink, convert_to_mo) - return str_2_mut_tree(expression) + if random: + str_2_mut_tree = rdstr2(cls.sink) + return str_2_mut_tree(expression) + else: + str_2_mut_tree = str2(cls.sink, convert_to_mo) + return str_2_mut_tree(expression) @classmethod @coroutine