Feat(random): random tree generation flow is ok. Need to create generate
function
This commit is contained in:
parent
3e43684937
commit
538cbdcbcc
@ -7,7 +7,7 @@
|
||||
# Distributed under terms of the MIT license.
|
||||
|
||||
"""
|
||||
Tools to extract random nodes, random variables, generate random values and
|
||||
Tools to extract random leafs, random variables, generate random values and
|
||||
fill new trees
|
||||
|
||||
Flow
|
||||
@ -15,9 +15,9 @@ Flow
|
||||
|
||||
Tree with RdLeaf
|
||||
|
|
||||
| Extract nodes
|
||||
| Extract rdLeaf
|
||||
|
|
||||
List of nodes to generate
|
||||
List of leafs to generate
|
||||
|
|
||||
| extract_rv
|
||||
|
|
||||
@ -27,41 +27,100 @@ List random variables to generate
|
||||
|
|
||||
Dictionnary of generated random variables
|
||||
|
|
||||
| Compute nodes
|
||||
| Compute leafs
|
||||
|
|
||||
Dictionnary of computed nodes
|
||||
Dictionnary of computed leafs
|
||||
|
|
||||
| Replace
|
||||
|
|
||||
Tree with RdLeaf replaced by generated values
|
||||
|
||||
: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']
|
||||
|
||||
|
||||
"""
|
||||
|
||||
from .leaf import RdLeaf
|
||||
|
||||
def extract_rv(node_list):
|
||||
""" Extract the set of random values from the node list
|
||||
def extract_rdleaf(tree):
|
||||
""" Extract rdLeaf in a Tree
|
||||
|
||||
:param node_list: list of nodes
|
||||
: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
|
||||
|
||||
def extract_rv(leafs):
|
||||
""" Extract the set of random values from the leaf list
|
||||
|
||||
:param leafs: list of leafs
|
||||
:return: set of random values
|
||||
|
||||
:example:
|
||||
>>> node_list = ["{a}", "{a*k}"]
|
||||
>>> extract_rv(node_list)
|
||||
{"a", "k"}
|
||||
>>> leafs = ["a", "a*k"]
|
||||
>>> list(extract_rv(leafs))
|
||||
['a', 'k']
|
||||
"""
|
||||
pass
|
||||
rd_values = set()
|
||||
for leaf in leafs:
|
||||
for c in leaf:
|
||||
if c.isalpha():
|
||||
rd_values.add(c)
|
||||
return rd_values
|
||||
|
||||
def compute_nodes(node_list, generated_values):
|
||||
""" Compute nodes from generated random values
|
||||
def compute_leafs(leafs, generated_values):
|
||||
""" Compute leafs from generated random values
|
||||
|
||||
:param generated_values: Dictionnary of name:generated value
|
||||
:param node_list: list of nodes
|
||||
:return: Dictionnary of evaluated nodes from generated values
|
||||
:param leafs: list of leafs
|
||||
:return: Dictionnary of evaluated leafs from generated values
|
||||
|
||||
:example:
|
||||
>>> node_list = ["{a}", "{a*k}"]
|
||||
>>> leafs = ["a", "a*k"]
|
||||
>>> generated_values = {"a":2, "k":3}
|
||||
>>> compute_nodes(node_list, generated_values)
|
||||
{"{a}": 2, "{a*k}": 6}
|
||||
>>> compute_leafs(leafs, generated_values)
|
||||
{'a': 2, 'a*k': 6}
|
||||
"""
|
||||
pass
|
||||
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)
|
||||
|
||||
|
32
mapytex/calculus/core/random/leaf.py
Normal file
32
mapytex/calculus/core/random/leaf.py
Normal file
@ -0,0 +1,32 @@
|
||||
#! /usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
# vim:fenc=utf-8
|
||||
#
|
||||
# Copyright © 2017 lafrite <lafrite@Poivre>
|
||||
#
|
||||
# Distributed under terms of the MIT license.
|
||||
|
||||
"""
|
||||
|
||||
"""
|
||||
|
||||
class RdLeaf():
|
||||
""" Random leaf
|
||||
|
||||
"""
|
||||
def __init__(self, name):
|
||||
self._name = name
|
||||
self.rdleaf = True
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
return self._name
|
||||
|
||||
def replace(self, computed):
|
||||
return computed[self.name]
|
||||
|
||||
def __str__(self):
|
||||
return "{" + self.name + "}"
|
||||
|
||||
def __repr__(self):
|
||||
return f"<{self.__class__.__name__} {self.__str__}>"
|
Loading…
Reference in New Issue
Block a user