Refact: move random function away from core
This commit is contained in:
parent
daed07efa3
commit
1672530179
@ -12,13 +12,13 @@ Expression
|
|||||||
"""
|
"""
|
||||||
from functools import partial
|
from functools import partial
|
||||||
from ..core import AssocialTree, Tree, compute, typing, TypingError
|
from ..core import AssocialTree, Tree, compute, typing, TypingError
|
||||||
from ..core.random import (
|
#from ..core.random import (
|
||||||
extract_rdleaf,
|
# extract_rdleaf,
|
||||||
extract_rv,
|
# extract_rv,
|
||||||
random_generator,
|
# random_generator,
|
||||||
compute_leafs,
|
# compute_leafs,
|
||||||
replace_rdleaf,
|
# replace_rdleaf,
|
||||||
)
|
#)
|
||||||
from ..core.MO import moify
|
from ..core.MO import moify
|
||||||
from .tokens import factory
|
from .tokens import factory
|
||||||
from .renders import render
|
from .renders import render
|
||||||
|
@ -13,7 +13,7 @@ Tokens representing interger and decimal
|
|||||||
from decimal import Decimal as _Decimal
|
from decimal import Decimal as _Decimal
|
||||||
from .token import Token
|
from .token import Token
|
||||||
from ...core.arithmetic import gcd
|
from ...core.arithmetic import gcd
|
||||||
from ...core.random.int_gene import filter_random
|
#from ...core.random.int_gene import filter_random
|
||||||
from ...core.MO import MO, MOnumber
|
from ...core.MO import MO, MOnumber
|
||||||
from ...core.MO.fraction import MOFraction
|
from ...core.MO.fraction import MOFraction
|
||||||
from random import random
|
from random import random
|
||||||
|
@ -31,7 +31,7 @@ Expression is the classe wich handle all calculus. It can randomly generate or i
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
from .API import Expression, Integer, Decimal, render, Polynomial, Fraction
|
from .API import Expression, Integer, Decimal, render, Polynomial, Fraction
|
||||||
from .core import random_list
|
#from .core import random_list
|
||||||
from decimal import getcontext
|
from decimal import getcontext
|
||||||
#getcontext().prec = 2
|
#getcontext().prec = 2
|
||||||
|
|
||||||
|
@ -66,7 +66,6 @@ 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 as random_list
|
|
||||||
|
|
||||||
|
|
||||||
# -----------------------------
|
# -----------------------------
|
||||||
|
@ -15,7 +15,6 @@ from decimal import Decimal, InvalidOperation
|
|||||||
from .coroutine import *
|
from .coroutine import *
|
||||||
from .operator import is_operator
|
from .operator import is_operator
|
||||||
from .MO import moify_cor
|
from .MO import moify_cor
|
||||||
from .random.leaf import look_for_rdleaf, RdLeaf
|
|
||||||
|
|
||||||
__all__ = ["str2"]
|
__all__ = ["str2"]
|
||||||
|
|
||||||
@ -810,38 +809,7 @@ def str2(sink, convert_to_mo=True):
|
|||||||
|
|
||||||
return pipeline
|
return pipeline
|
||||||
|
|
||||||
|
|
||||||
def rdstr2(sink):
|
|
||||||
""" Return a pipeline which parse random expression and with sink as endpoint
|
|
||||||
|
|
||||||
:example:
|
|
||||||
>>> rdstr2list = rdstr2(list_sink)
|
|
||||||
>>> rdstr2list("{a}+{a*b}-2")
|
|
||||||
[<RdLeaf a>, '+', <RdLeaf a*b>, '+', <MOnumber -2>]
|
|
||||||
>>> rdstr2list("{a}({b}x+{c})")
|
|
||||||
[<RdLeaf a>, '*', [<RdLeaf b>, '*', <MOstr x>, '+', <RdLeaf c>]]
|
|
||||||
"""
|
|
||||||
lfop = lookfor(is_operator)
|
|
||||||
operator_corout = partial(concurent_broadcast, lookfors=[lfop])
|
|
||||||
|
|
||||||
def pipeline(expression):
|
|
||||||
str2_corout = look_for_rdleaf(
|
|
||||||
lookforNumbers(operator_corout(
|
|
||||||
missing_times(moify_cor(pparser(sink)))))
|
|
||||||
)
|
|
||||||
|
|
||||||
for i in expression.replace(" ", ""):
|
|
||||||
str2_corout.send(i)
|
|
||||||
a = str2_corout.throw(STOOOP)
|
|
||||||
|
|
||||||
return a
|
|
||||||
|
|
||||||
return pipeline
|
|
||||||
|
|
||||||
|
|
||||||
str2nestedlist = str2(list_sink)
|
str2nestedlist = str2(list_sink)
|
||||||
|
|
||||||
|
|
||||||
# -----------------------------
|
# -----------------------------
|
||||||
# Reglages pour 'vim'
|
# Reglages pour 'vim'
|
||||||
# vim:set autoindent expandtab tabstop=4 shiftwidth=4:
|
# vim:set autoindent expandtab tabstop=4 shiftwidth=4:
|
||||||
|
@ -11,7 +11,7 @@ Tree class
|
|||||||
|
|
||||||
from .tree_tools import to_nested_parenthesis, postfix_concatenate, show_tree
|
from .tree_tools import to_nested_parenthesis, postfix_concatenate, show_tree
|
||||||
from .coroutine import coroutine, STOOOP
|
from .coroutine import coroutine, STOOOP
|
||||||
from .str2 import str2, rdstr2
|
from .str2 import str2
|
||||||
from .operator import OPERATORS, is_operator
|
from .operator import OPERATORS, is_operator
|
||||||
|
|
||||||
__all__ = ["Tree", "MutableTree"]
|
__all__ = ["Tree", "MutableTree"]
|
||||||
@ -51,7 +51,7 @@ class Tree:
|
|||||||
self.right_value = right_value
|
self.right_value = right_value
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_str(cls, expression, convert_to_mo=True, random=False):
|
def from_str(cls, expression, convert_to_mo=True):
|
||||||
""" Initiate a tree from an string expression
|
""" Initiate a tree from an string expression
|
||||||
|
|
||||||
:example:
|
:example:
|
||||||
@ -77,26 +77,8 @@ class Tree:
|
|||||||
> *
|
> *
|
||||||
| > 3
|
| > 3
|
||||||
| > n
|
| > n
|
||||||
>>> t = Tree.from_str("2+{n}x", random=True)
|
|
||||||
>>> print(t)
|
|
||||||
+
|
|
||||||
> 2
|
|
||||||
> *
|
|
||||||
| > {n}
|
|
||||||
| > x
|
|
||||||
>>> t = Tree.from_str("{a}({b}x+{c})", random=True)
|
|
||||||
>>> print(t)
|
|
||||||
*
|
|
||||||
> {a}
|
|
||||||
> +
|
|
||||||
| > *
|
|
||||||
| | > {b}
|
|
||||||
| | > x
|
|
||||||
| > {c}
|
|
||||||
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
t = MutableTree.from_str(expression, convert_to_mo, random)
|
t = MutableTree.from_str(expression, convert_to_mo)
|
||||||
return cls.from_any_tree(t)
|
return cls.from_any_tree(t)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -907,7 +889,7 @@ class MutableTree(Tree):
|
|||||||
self.right_value = right_value
|
self.right_value = right_value
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_str(cls, expression, convert_to_mo=True, random=False):
|
def from_str(cls, expression, convert_to_mo=True):
|
||||||
""" Initiate the MutableTree
|
""" Initiate the MutableTree
|
||||||
|
|
||||||
:example:
|
:example:
|
||||||
@ -963,29 +945,9 @@ class MutableTree(Tree):
|
|||||||
| | > 8
|
| | > 8
|
||||||
| | > 3
|
| | > 3
|
||||||
| > x
|
| > x
|
||||||
>>> t = MutableTree.from_str("{b}*x+{c}", random=True)
|
|
||||||
>>> print(t)
|
|
||||||
+
|
|
||||||
> *
|
|
||||||
| > {b}
|
|
||||||
| > x
|
|
||||||
> {c}
|
|
||||||
>>> t = MutableTree.from_str("{a}*({b}*x+{c})", random=True)
|
|
||||||
>>> print(t)
|
|
||||||
*
|
|
||||||
> {a}
|
|
||||||
> +
|
|
||||||
| > *
|
|
||||||
| | > {b}
|
|
||||||
| | > x
|
|
||||||
| > {c}
|
|
||||||
"""
|
"""
|
||||||
if random:
|
str_2_mut_tree = str2(cls.sink, convert_to_mo)
|
||||||
str_2_mut_tree = rdstr2(cls.sink)
|
return str_2_mut_tree(expression)
|
||||||
return str_2_mut_tree(expression)
|
|
||||||
else:
|
|
||||||
str_2_mut_tree = str2(cls.sink, convert_to_mo)
|
|
||||||
return str_2_mut_tree(expression)
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@coroutine
|
@coroutine
|
||||||
|
0
mapytex/calculus/random/__init__.py
Normal file
0
mapytex/calculus/random/__init__.py
Normal file
@ -37,7 +37,8 @@ Tree with RdLeaf replaced by generated values
|
|||||||
|
|
||||||
:example:
|
:example:
|
||||||
|
|
||||||
>>> from ..tree import Tree
|
>>> from ...core.tree import Tree
|
||||||
|
>>> from .leaf import RdLeaf
|
||||||
>>> rd_t = Tree("/", RdLeaf("a"), RdLeaf("a*k"))
|
>>> rd_t = Tree("/", RdLeaf("a"), RdLeaf("a*k"))
|
||||||
>>> print(rd_t)
|
>>> print(rd_t)
|
||||||
/
|
/
|
||||||
@ -74,16 +75,16 @@ This function ignores tree structure and works with lists
|
|||||||
__all__ = ["list_generator"]
|
__all__ = ["list_generator"]
|
||||||
|
|
||||||
from random import choice
|
from random import choice
|
||||||
from functools import reduce
|
|
||||||
from .leaf import RdLeaf
|
|
||||||
|
|
||||||
|
|
||||||
def extract_rdleaf(tree):
|
def extract_rdleaf(tree):
|
||||||
""" Extract rdLeaf in a Tree
|
""" Extract rdLeaf in a Tree
|
||||||
|
|
||||||
:example:
|
:example:
|
||||||
>>> from ..tree import Tree
|
>>> from ...core.tree import Tree
|
||||||
|
>>> from .leaf import RdLeaf
|
||||||
>>> rd_t = Tree("+", RdLeaf("a"), RdLeaf("a*k"))
|
>>> rd_t = Tree("+", RdLeaf("a"), RdLeaf("a*k"))
|
||||||
|
>>> from .leaf import RdLeaf
|
||||||
>>> extract_rdleaf(rd_t)
|
>>> extract_rdleaf(rd_t)
|
||||||
['a', 'a*k']
|
['a', 'a*k']
|
||||||
>>> rd_t = Tree("+", RdLeaf("a"), 2)
|
>>> rd_t = Tree("+", RdLeaf("a"), 2)
|
||||||
@ -139,7 +140,8 @@ def compute_leafs(leafs, generated_values):
|
|||||||
def replace_rdleaf(tree, computed_leafs):
|
def replace_rdleaf(tree, computed_leafs):
|
||||||
""" Replace RdLeaf by the corresponding computed value
|
""" Replace RdLeaf by the corresponding computed value
|
||||||
|
|
||||||
>>> from ..tree import Tree
|
>>> from ...core.tree import Tree
|
||||||
|
>>> from .leaf import RdLeaf
|
||||||
>>> rd_t = Tree("+", RdLeaf("a"), RdLeaf("a*k"))
|
>>> rd_t = Tree("+", RdLeaf("a"), RdLeaf("a*k"))
|
||||||
>>> computed_leafs = {'a': 2, 'a*k': 6}
|
>>> computed_leafs = {'a': 2, 'a*k': 6}
|
||||||
>>> print(replace_rdleaf(rd_t, computed_leafs))
|
>>> print(replace_rdleaf(rd_t, computed_leafs))
|
@ -9,7 +9,7 @@
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
"""
|
"""
|
||||||
from ..coroutine import *
|
from ...core.coroutine import coroutine, STOOOP
|
||||||
|
|
||||||
|
|
||||||
@coroutine
|
@coroutine
|
||||||
@ -17,7 +17,7 @@ def look_for_rdleaf(target):
|
|||||||
""" Coroutine which look to "{...}" which are RdLeaf
|
""" Coroutine which look to "{...}" which are RdLeaf
|
||||||
|
|
||||||
:example:
|
:example:
|
||||||
>>> from ..str2 import list_sink
|
>>> from ...core.str2 import list_sink
|
||||||
>>> str2list = look_for_rdleaf(list_sink)
|
>>> str2list = look_for_rdleaf(list_sink)
|
||||||
>>> for i in "{a}+{a*b}-2":
|
>>> for i in "{a}+{a*b}-2":
|
||||||
... str2list.send(i)
|
... str2list.send(i)
|
65
mapytex/calculus/random/core/str2.py
Normal file
65
mapytex/calculus/random/core/str2.py
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
|
||||||
|
from ...core.operator import is_operator
|
||||||
|
from functools import partial
|
||||||
|
from ...core.str2 import concurent_broadcast, lookforNumbers, pparser, missing_times, lookfor
|
||||||
|
from ...core.coroutine import STOOOP
|
||||||
|
from ...core.MO import moify_cor
|
||||||
|
from ...core.tree import MutableTree
|
||||||
|
from .leaf import look_for_rdleaf
|
||||||
|
|
||||||
|
def rdstr2(sink):
|
||||||
|
""" Return a pipeline which parse random expression and with sink as endpoint
|
||||||
|
|
||||||
|
:example:
|
||||||
|
>>> from ...core.str2 import list_sink
|
||||||
|
>>> rdstr2list = rdstr2(list_sink)
|
||||||
|
>>> rdstr2list("{a}+{a*b}-2")
|
||||||
|
[<RdLeaf a>, '+', <RdLeaf a*b>, '+', <MOnumber -2>]
|
||||||
|
>>> rdstr2list("{a}({b}x+{c})")
|
||||||
|
[<RdLeaf a>, '*', [<RdLeaf b>, '*', <MOstr x>, '+', <RdLeaf c>]]
|
||||||
|
"""
|
||||||
|
lfop = lookfor(is_operator)
|
||||||
|
operator_corout = partial(concurent_broadcast, lookfors=[lfop])
|
||||||
|
|
||||||
|
def pipeline(expression):
|
||||||
|
str2_corout = look_for_rdleaf(
|
||||||
|
lookforNumbers(operator_corout(
|
||||||
|
missing_times(moify_cor(pparser(sink)))))
|
||||||
|
)
|
||||||
|
|
||||||
|
for i in expression.replace(" ", ""):
|
||||||
|
str2_corout.send(i)
|
||||||
|
a = str2_corout.throw(STOOOP)
|
||||||
|
|
||||||
|
return a
|
||||||
|
|
||||||
|
return pipeline
|
||||||
|
|
||||||
|
class RandomTree(MutableTree):
|
||||||
|
""" MutableTree that accept {a} syntax for random generation """
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_str(cls, expression):
|
||||||
|
""" Initiate a random tree from a string that need to be parsed
|
||||||
|
|
||||||
|
:exemple:
|
||||||
|
>>> t = RandomTree.from_str("{b}*x+{c}")
|
||||||
|
>>> print(t)
|
||||||
|
+
|
||||||
|
> *
|
||||||
|
| > {b}
|
||||||
|
| > x
|
||||||
|
> {c}
|
||||||
|
>>> t = RandomTree.from_str("{a}*({b}*x+{c})")
|
||||||
|
>>> print(t)
|
||||||
|
*
|
||||||
|
> {a}
|
||||||
|
> +
|
||||||
|
| > *
|
||||||
|
| | > {b}
|
||||||
|
| | > x
|
||||||
|
| > {c}
|
||||||
|
"""
|
||||||
|
str_2_mut_tree = rdstr2(cls.sink)
|
||||||
|
return str_2_mut_tree(expression)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user