2019-05-09 14:46:24 +00:00
|
|
|
#! /usr/bin/env python
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# vim:fenc=utf-8
|
|
|
|
#
|
|
|
|
# Copyright © 2017 lafrite <lafrite@Poivre>
|
|
|
|
#
|
|
|
|
# Distributed under terms of the MIT license.
|
|
|
|
|
|
|
|
"""
|
2019-05-09 16:37:39 +00:00
|
|
|
Tools to extract random leafs, random variables, generate random values and
|
2019-05-09 14:46:24 +00:00
|
|
|
fill new trees
|
|
|
|
|
|
|
|
Flow
|
|
|
|
----
|
|
|
|
|
|
|
|
Tree with RdLeaf
|
|
|
|
|
|
2019-05-09 16:37:39 +00:00
|
|
|
| Extract rdLeaf
|
2019-05-09 14:46:24 +00:00
|
|
|
|
|
2019-05-09 16:37:39 +00:00
|
|
|
List of leafs to generate
|
2019-05-09 14:46:24 +00:00
|
|
|
|
|
|
|
|
| extract_rv
|
|
|
|
|
|
|
|
|
List random variables to generate
|
|
|
|
|
|
|
|
|
| Generate
|
|
|
|
|
|
|
|
|
Dictionnary of generated random variables
|
|
|
|
|
|
2019-05-09 16:37:39 +00:00
|
|
|
| Compute leafs
|
2019-05-09 14:46:24 +00:00
|
|
|
|
|
2019-05-09 16:37:39 +00:00
|
|
|
Dictionnary of computed leafs
|
2019-05-09 14:46:24 +00:00
|
|
|
|
|
|
|
|
| Replace
|
|
|
|
|
|
|
|
|
Tree with RdLeaf replaced by generated values
|
|
|
|
|
2019-05-09 16:37:39 +00:00
|
|
|
:example:
|
|
|
|
|
|
|
|
>>> from ..tree import Tree
|
|
|
|
>>> rd_t = Tree("+", RdLeaf("a"), RdLeaf("a*k"))
|
|
|
|
>>> print(rd_t)
|
|
|
|
+
|
|
|
|
> {a}
|
|
|
|
> {a*k}
|
|
|
|
>>> extract_rdleaf(rd_t)
|
|
|
|
['a', 'a*k']
|
|
|
|
|
|
|
|
|
2019-05-09 14:46:24 +00:00
|
|
|
"""
|
|
|
|
|
2019-05-09 16:37:39 +00:00
|
|
|
from .leaf import RdLeaf
|
2019-05-09 14:46:24 +00:00
|
|
|
|
2019-05-09 16:37:39 +00:00
|
|
|
def extract_rdleaf(tree):
|
|
|
|
""" Extract rdLeaf in a Tree
|
|
|
|
|
|
|
|
:example:
|
|
|
|
>>> from ..tree import Tree
|
|
|
|
>>> rd_t = Tree("+", RdLeaf("a"), RdLeaf("a*k"))
|
|
|
|
>>> extract_rdleaf(rd_t)
|
|
|
|
['a', 'a*k']
|
|
|
|
>>> rd_t = Tree("+", RdLeaf("a"), 2)
|
|
|
|
>>> extract_rdleaf(rd_t)
|
|
|
|
['a']
|
|
|
|
"""
|
|
|
|
rd_leafs = []
|
|
|
|
for leaf in tree.get_leafs():
|
|
|
|
try:
|
|
|
|
leaf.rdleaf
|
|
|
|
except AttributeError:
|
|
|
|
pass
|
|
|
|
else:
|
|
|
|
rd_leafs.append(leaf.name)
|
|
|
|
return rd_leafs
|
2019-05-09 14:46:24 +00:00
|
|
|
|
2019-05-09 16:37:39 +00:00
|
|
|
def extract_rv(leafs):
|
|
|
|
""" Extract the set of random values from the leaf list
|
|
|
|
|
|
|
|
:param leafs: list of leafs
|
2019-05-09 14:46:24 +00:00
|
|
|
:return: set of random values
|
|
|
|
|
|
|
|
:example:
|
2019-05-09 16:37:39 +00:00
|
|
|
>>> leafs = ["a", "a*k"]
|
|
|
|
>>> list(extract_rv(leafs))
|
|
|
|
['a', 'k']
|
2019-05-09 14:46:24 +00:00
|
|
|
"""
|
2019-05-09 16:37:39 +00:00
|
|
|
rd_values = set()
|
|
|
|
for leaf in leafs:
|
|
|
|
for c in leaf:
|
|
|
|
if c.isalpha():
|
|
|
|
rd_values.add(c)
|
|
|
|
return rd_values
|
2019-05-09 14:46:24 +00:00
|
|
|
|
2019-05-09 16:37:39 +00:00
|
|
|
def compute_leafs(leafs, generated_values):
|
|
|
|
""" Compute leafs from generated random values
|
2019-05-09 14:46:24 +00:00
|
|
|
|
|
|
|
:param generated_values: Dictionnary of name:generated value
|
2019-05-09 16:37:39 +00:00
|
|
|
:param leafs: list of leafs
|
|
|
|
:return: Dictionnary of evaluated leafs from generated values
|
2019-05-09 14:46:24 +00:00
|
|
|
|
|
|
|
:example:
|
2019-05-09 16:37:39 +00:00
|
|
|
>>> leafs = ["a", "a*k"]
|
2019-05-09 14:46:24 +00:00
|
|
|
>>> generated_values = {"a":2, "k":3}
|
2019-05-09 16:37:39 +00:00
|
|
|
>>> compute_leafs(leafs, generated_values)
|
|
|
|
{'a': 2, 'a*k': 6}
|
2019-05-09 14:46:24 +00:00
|
|
|
"""
|
2019-05-09 16:37:39 +00:00
|
|
|
return {leaf: eval(leaf, generated_values) for leaf in leafs}
|
|
|
|
|
|
|
|
def replace_rdleaf(tree, computed_leafs):
|
|
|
|
""" Replace RdLeaf by the corresponding computed value
|
|
|
|
|
|
|
|
>>> from ..tree import Tree
|
|
|
|
>>> rd_t = Tree("+", RdLeaf("a"), RdLeaf("a*k"))
|
|
|
|
>>> computed_leafs = {'a': 2, 'a*k': 6}
|
|
|
|
>>> print(replace_rdleaf(rd_t, computed_leafs))
|
|
|
|
+
|
|
|
|
> 2
|
|
|
|
> 6
|
|
|
|
"""
|
|
|
|
def replace(leaf):
|
|
|
|
try:
|
|
|
|
return leaf.replace(computed_leafs)
|
|
|
|
except AttributeError:
|
|
|
|
return leaf
|
|
|
|
return tree.map_on_leaf(replace)
|
|
|
|
|