Feat: random list generator

This commit is contained in:
Bertrand Benjamin 2020-08-20 17:36:38 +02:00
parent 700665c0a5
commit 8d9294afe1
4 changed files with 39 additions and 3 deletions

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
# encoding: utf-8 # encoding: utf-8
from .calculus import Expression, Integer, Decimal from .calculus import Expression, Integer, Decimal, list_generator
# Expression.set_render('tex') # Expression.set_render('tex')

View File

@ -31,6 +31,7 @@ Expression is the classe wich handle all calculus. It can randomly generate or i
""" """
from .API import Expression, Integer, Decimal from .API import Expression, Integer, Decimal
from .core import list_generator
from decimal import getcontext from decimal import getcontext
#getcontext().prec = 2 #getcontext().prec = 2

View File

@ -66,6 +66,7 @@ from .tree import Tree, AssocialTree
from .compute import compute from .compute import compute
from .typing import typing, TypingError from .typing import typing, TypingError
from .renders import tree2txt, tree2tex from .renders import tree2txt, tree2tex
from .random import list_generator
# ----------------------------- # -----------------------------

View File

@ -47,8 +47,8 @@ Tree with RdLeaf replaced by generated values
>>> leafs >>> leafs
['a', 'a*k'] ['a', 'a*k']
>>> rd_varia = extract_rv(leafs) >>> rd_varia = extract_rv(leafs)
>>> rd_varia # doctest: +SKIP >>> sorted(list(rd_varia))
{'a', 'k'} ['a', 'k']
>>> generated = random_generator(rd_varia, conditions=['a%2+1']) >>> generated = random_generator(rd_varia, conditions=['a%2+1'])
>>> generated # doctest: +SKIP >>> generated # doctest: +SKIP
{'a': 7, 'k': 4} {'a': 7, 'k': 4}
@ -61,8 +61,18 @@ Tree with RdLeaf replaced by generated values
> 7 > 7
> 28 > 28
List generator
--------------
This function ignores tree structure and works with lists
>>> values = list_generator(["a", "a*b", "b", "c"], conditions=["b%c==1"])
>>> values # doctest: +SKIP
{'a': -8, 'a*b': -40, 'b': 5, 'c': 4}
""" """
__all__ = ["generator"]
from random import choice from random import choice
from functools import reduce from functools import reduce
from .leaf import RdLeaf from .leaf import RdLeaf
@ -244,3 +254,27 @@ def build_variable_scope(rd_variables, rejected, min_max, variables_scope):
except KeyError: except KeyError:
complete_scope[v]["min_max"] = min_max complete_scope[v]["min_max"] = min_max
return complete_scope return complete_scope
def list_generator(var_list, conditions=[], rejected=[0], min_max=(-10, 10), variables_scope={}):
""" Generate random computed values from the list
:param rd_variables: list of random variables to generate (can be computed value - "a*b")
:param conditions: condition over variables
:param rejected: Rejected values for the generator (default [0])
:param min_max: (min, max) limits in between variables will be generated
:param variables_scope: rejected and min_max define for individual variables
:return: dictionnary of generated variables
:example:
>>> values = list_generator(["a", "a*b", "b", "c"])
>>> values # doctest: +SKIP
>>> values["a"] * values["b"] == values["a*b"]
True
>>> values["a*b"] # doctest: +SKIP
>>> values["a"] * values["b"] # doctest: +SKIP
"""
rv = extract_rv(var_list)
rv_gen = random_generator(rv, conditions, rejected, min_max, variables_scope)
generated = compute_leafs(var_list, rv_gen)
return generated