Compare commits

..

7 Commits

Author SHA1 Message Date
bb43611f67 Test: separate expression build and showing it
All checks were successful
continuous-integration/drone/push Build is passing
2020-11-15 21:12:26 +01:00
9dc4d08619 Feat: return value for random_list 2020-11-15 21:12:26 +01:00
33c4872ff7 Fix: rename list_generator to random_list 2020-11-15 21:12:26 +01:00
76dad93f03 Tagging: bad version number! 2020-11-15 21:12:26 +01:00
6f7fd416be Tagging: change version to 2.2 2020-11-15 21:12:26 +01:00
8d9294afe1 Feat: random list generator 2020-11-15 21:12:26 +01:00
700665c0a5 Feat: add autopublishing 2020-11-15 21:12:26 +01:00
7 changed files with 61 additions and 6 deletions

View File

@ -7,3 +7,12 @@ steps:
commands: commands:
- pip install -r requirements.txt - pip install -r requirements.txt
- pytest --doctest-modules ./mapytex/ - pytest --doctest-modules ./mapytex/
- name: Publish
image: plugins/pypi
settings:
username:
from_secret: pypi_username
password:
from_secret: pypi_password
when:
event: tag

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, random_list
# Expression.set_render('tex') # Expression.set_render('tex')

View File

@ -136,9 +136,11 @@ class Expression(object):
:returns: TODO :returns: TODO
:example: :example:
>>> Expression.random("{a}/{a*k}") # doctest: +SKIP >>> e = Expression.random("{a}/{a*k}")
>>> e # doctest: +SKIP
<Exp: -3 / -15> <Exp: -3 / -15>
>>> Expression.random("{a}/{a*k} - 3*{b}", variables_scope={'a':{'min_max':(10, 30)}}) # doctest: +SKIP >>> e = Expression.random("{a}/{a*k} - 3*{b}", variables_scope={'a':{'min_max':(10, 30)}})
>>> e # doctest: +SKIP
<Exp: 18 / 108 - 3 * 9> <Exp: 18 / 108 - 3 * 9>
>>> e = Expression.random("{a}*x + {b}*x + 3", ["a>b"], rejected=[0, 1]) >>> e = Expression.random("{a}*x + {b}*x + 3", ["a>b"], rejected=[0, 1])
>>> ee = e.simplify() >>> ee = e.simplify()

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 random_list
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 as random_list
# ----------------------------- # -----------------------------

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__ = ["list_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,35 @@ 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={}, dictionnary=False):
""" 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
:param dictionnary: the return value will be a dictionnary with var_list as keys (default False)
:return: dictionnary of generated variables
:example:
>>> a, ab, b, c = list_generator(["a", "a*b", "b", "c"])
>>> a, ab, b, c # doctest: +SKIP
(5, -20, -4, -3)
>>> a * b == ab
True
>>> ab # doctest: +SKIP
-20
>>> a, b # doctest: +SKIP
5, -4
>>> list_generator(["a", "a*b", "b", "c"], dictionnary=True) # doctest: +SKIP
{'a': -3, 'a*b': 18, 'b': -6, 'c': -4}
"""
rv = extract_rv(var_list)
rv_gen = random_generator(rv, conditions, rejected, min_max, variables_scope)
generated = compute_leafs(var_list, rv_gen)
if dictionnary:
return generated
return [generated[v] for v in var_list]

View File

@ -7,7 +7,7 @@ except ImportError:
setup( setup(
name="mapytex", name="mapytex",
version="2.1", version="2.3.2",
description="Computing like a student", description="Computing like a student",
author="Benjamin Bertrand", author="Benjamin Bertrand",
author_email="programming@opytex.org", author_email="programming@opytex.org",