from ..API.expression import Expression from ..core.tree import Tree def expression(): """ Generate a random expression """ pass @classmethod 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: >>> e = Expression.random("{a}/{a*k}") >>> e # doctest: +SKIP >>> e = Expression.random("{a}/{a*k} - 3*{b}", variables_scope={'a':{'min_max':(10, 30)}}) >>> e # doctest: +SKIP >>> e = Expression.random("{a}*x + {b}*x + 3", ["a>b"], rejected=[0, 1]) >>> ee = e.simplify() >>> print(e) # doctest: +SKIP 10x - 6x + 3 >>> print(ee) # doctest: +SKIP 4x + 3 """ rd_t = Tree.from_str(template) 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) if shuffle: raise NotImplemented("Can't suffle expression yet") return cls._post_processing(t)