Feat: Default render is txt

This commit is contained in:
Bertrand Benjamin 2019-07-11 10:36:35 +02:00
parent 116c1fac29
commit 7c4dc05e34
2 changed files with 54 additions and 38 deletions

View File

@ -14,13 +14,13 @@ Les calculs peuvent être déclarés à partir d'une chaine de caractères.
.. code-block:: python .. code-block:: python
>>> from pymath import Expression >>> from mapytex import Expression
>>> priorite = Expression.from_str("2 + 3*(4+5*6)") >>> priorite = Expression.from_str("2 + 3*(4+5*6)")
>>> print(priorite) >>> print(priorite)
2 + 3(4 + 5 \times 6) 2 + 3(4 + 5 * 6)
>>> ajout_fractions = Expression.from_str("2 / 5 + 2 / 3") >>> ajout_fractions = Expression.from_str("2 / 5 + 2 / 3")
>>> print(ajout_fractions) >>> print(ajout_fractions)
\frac{ 2 }{ 5 } + \frac{ 2 }{ 3 } 2 / 5 + 2 / 3
>>> doubledev = Expression.from_str("(x+2)(3x-4)") >>> doubledev = Expression.from_str("(x+2)(3x-4)")
>>> print(doubledev) >>> print(doubledev)
(x+2)(3x-4) (x+2)(3x-4)
@ -29,7 +29,7 @@ La simplification des expressions est basée sur la méthode **.simplify()**
.. code-block:: python .. code-block:: python
>>> from pymath import Expression >>> from mapytex import Expression
>>> priorite = Expression.from_str("2 + 3*(4+5*6)") >>> priorite = Expression.from_str("2 + 3*(4+5*6)")
>>> resultat = priorite.simplify() >>> resultat = priorite.simplify()
>>> print(resultat) >>> print(resultat)
@ -37,7 +37,7 @@ La simplification des expressions est basée sur la méthode **.simplify()**
>>> ajout_fractions = Expression.from_str("2 / 5 + 2 / 3") >>> ajout_fractions = Expression.from_str("2 / 5 + 2 / 3")
>>> resultat = ajout_fractions.simplify() >>> resultat = ajout_fractions.simplify()
>>> print(resultat) >>> print(resultat)
\frac{ 16 }{ 15 } 16 / 15
>>> doubledev = Expression.from_str("(x+2)(3x-4)") >>> doubledev = Expression.from_str("(x+2)(3x-4)")
>>> resultat = doubledev.simplify() >>> resultat = doubledev.simplify()
>>> print(resultat) >>> print(resultat)
@ -47,35 +47,35 @@ Pour avoir l'explication et le détail des calculs, il va falloir faire une bouc
.. code-block:: python .. code-block:: python
>>> from pymath import Expression >>> from mapytex import Expression
>>> priorite = Expression.from_str("2 + 3*(4+5*6)") >>> priorite = Expression.from_str("2 + 3*(4+5*6)")
>>> resultat = priorite.simplify() >>> resultat = priorite.simplify()
>>> for s in resultat.explain(): >>> for s in resultat.explain():
... print(s) ... print(s)
2 + 3(4 + 5 \times 6) 2 + 3(4 + 5 * 6)
2 + 3(4 + 30) 2 + 3(4 + 30)
2 + 3 \times 34 2 + 3 * 34
2 + 102 2 + 102
104 104
>>> ajout_fractions = Expression.from_str("2 / 5 + 2 / 3") >>> ajout_fractions = Expression.from_str("2 / 5 + 2 / 3")
>>> resultat = ajout_fractions.simplify() >>> resultat = ajout_fractions.simplify()
>>> for s in resultat.explain(): >>> for s in resultat.explain():
... print(s) ... print(s)
\frac{2}{5} + \frac{2}{3} 2 / 5 + 2 / 3
\frac{2 \times 3}{5 \times 3} + \frac{2 \times 5}{3 \times 5} \frac{2 * 3}{5 * 3} + \frac{2 * 5}{3 * 5}
\frac{6}{15} + \frac{10}{15} 6 / 15 + 10 / 15
\frac{6 + 10}{15} \frac{6 + 10}{15}
\frac{16}{15} 16 / 15
>>> doubledev = Expression.from_str("(x+2)(3x-4)") >>> doubledev = Expression.from_str("(x+2)(3x-4)")
>>> resultat = doubledev.simplify() >>> resultat = doubledev.simplify()
>>> for s in resultat.explain(): >>> for s in resultat.explain():
... print(s) ... print(s)
(x + 2)(3x - 4) (x + 2)(3x - 4)
x \times 3x + x \times - 4 + 2 \times 3x + 2 \times - 4 x * 3x + x * - 4 + 2 * 3x + 2 * - 4
2 \times 3 \times x - 8 + 3x^2 - 4x 2 * 3 * x - 8 + 3x^2 - 4x
6x - 8 + 3x^2 - 4x 6x - 8 + 3x^2 - 4x
3x^2 + 6x - 4x - 8 3x^2 + 6x - 4x - 8
3x^2 + (6 - 4) \times x - 8 3x^2 + (6 - 4) * x - 8
3x^2 - 8 + 2x 3x^2 - 8 + 2x
Types de données manipulables Types de données manipulables
@ -88,22 +88,22 @@ Les expressions peuvent être générées aléatoirement avec la méthode **.ran
.. code-block:: python .. code-block:: python
>>> from pymath import Expression >>> from mapytex import Expression
>>> priorite = Expression.random("{a} + {b} * 5") >>> priorite = Expression.random("{a} + {b} * 5")
>>> print(priorite) >>> print(priorite)
2 + 3 \times 5 2 + 3 * 5
>>> priorite = Expression.random("{a} + {b} * 5") >>> priorite = Expression.random("{a} + {b} * 5")
>>> print(priorite) >>> print(priorite)
9 - 3 \times 5 9 - 3 * 5
Les valeurs générées peuvent dépendre les unes des autres. Les valeurs générées peuvent dépendre les unes des autres.
.. code-block:: python .. code-block:: python
>>> from pymath import Expression >>> from mapytex import Expression
>>> priorite = Expression.random("{a} + {2*a} * 5") >>> priorite = Expression.random("{a} + {2*a} * 5")
>>> print(priorite) >>> print(priorite)
-1 - 2 \times 5 -1 - 2 * 5
>>> add_frac = Expression.random("{a} / {b} + {c} / {b*2}") >>> add_frac = Expression.random("{a} / {b} + {c} / {b*2}")
>>> print(add_frac) >>> print(add_frac)
\frac{- 2}{- 2} + \frac{2}{- 4} \frac{- 2}{- 2} + \frac{2}{- 4}
@ -112,33 +112,49 @@ Par défaut, les valeurs sont choisies aléatoirement entre -10 et 10 en évitan
.. code-block:: python .. code-block:: python
>>> from pymath import Expression >>> from mapytex import Expression
>>> priorite = Expression.random("{a} + {2*a} * 5", rejected=[1, 2], min_max=(0, 3)) >>> priorite = Expression.random("{a} + {2*a} * 5", rejected=[1, 2], min_max=(0, 3))
>>> print(priorite) >>> print(priorite)
0 + 0 \times 5 0 + 0 * 5
>>> priorite = Expression.random("{a} + {b} * 5", >>> priorite = Expression.random("{a} + {b} * 5",
rejected=[1, 2], min_max=(0, 3), rejected=[1, 2], min_max=(0, 3),
variables_scope={'a':{'min_max':(2, 5)}} variables_scope={'a':{'min_max':(2, 5)}}
) )
>>> print(priorite) >>> print(priorite)
5 + 3 \times 5 5 + 3 * 5
Enfin, il est possible de définir des conditions sur les valeurs générées en paramétrant *conditions*. Enfin, il est possible de définir des conditions sur les valeurs générées en paramétrant *conditions*.
.. code-block:: python .. code-block:: python
>>> from pymath import Expression >>> from mapytex import Expression
>>> add_frac = Expression.random("{a} / {b} + {c} / {d}", >>> add_frac = Expression.random("{a} / {b} + {c} / {d}",
conditions = ['b%d==0', 'a!=b', 'c!=d'] conditions = ['b%d==0', 'a!=b', 'c!=d']
) )
>>> print(add_frac) >>> print(add_frac)
\frac{10}{4} + \farc{- 7}{2} 10 / 4 - 7 / 2
Par contre, rien n'est fait qui permettrait de savoir si un ensemble de conditions permet de générée les valeurs demandées. Comme la génération des variables se fait avec la méthode par rejet, si les conditions ne permettent pas générer des valeurs convenables, le programme moulinera dans le vide... Par contre, rien n'est fait qui permettrait de savoir si un ensemble de conditions permet de générée les valeurs demandées. Comme la génération des variables se fait avec la méthode par rejet, si les conditions ne permettent pas générer des valeurs convenables, le programme moulinera dans le vide...
Il est prévu d'ajouter l'option *suffle* qui permettra de mélanger les termes des expressions. Il est prévu d'ajouter l'option *suffle* qui permettra de mélanger les termes des expressions.
Rendus
------
Par défaut, le rendu des expressions est en mode *texte*. Il est possible d'avoir aussi un rendu *latex*.
.. code-block:: python
>>> from mapytex import Expression
>>> e = Expression.from_str("2/3 + 4*5")
>>> print(e)
2 / 3 + 4 * 5
>>> Expression.set_render("tex")
>>> print(e)
\frac{2}{3} + 4 \times 5
>>> Expression.set_render("txt")
>>> print(e)
2 / 3 + 4 * 5
@ -208,19 +224,19 @@ Voici un exemple de l'utilisation du rendu latex (par défaut).
>>> for i in exp.simplify().explain(): >>> for i in exp.simplify().explain():
... print(i) ... print(i)
... ...
1 + \frac{ 2 }{ 5 } 1 + 2 / 5
\frac{ 1 \times 5 }{ 1 \times 5 } + \frac{ 2 \times 1 }{ 5 \times 1 } ( 1 * 5 ) / ( 1 * 5 ) + ( 2 * 1 ) / ( 5 * 1 )
\frac{ 5 + 2 }{ 5 } ( 5 + 2 ) / 5
\frac{ 7 }{ 5 } 7 / 5
Pour changer le rendu, on importe le rendu depuis *pymath.render* et on Pour changer le rendu, on importe le rendu depuis *mapytex.render* et on
appelle la méthode de classe d'Expression *set_render*. appelle la méthode de classe d'Expression *set_render*.
Voici un exemple d'utilisation du rendu txt Voici un exemple d'utilisation du rendu txt
.. code-block:: python .. code-block:: python
>>> from pymath import txt >>> from mapytex import txt
>>> Expression.set_render(txt) >>> Expression.set_render(txt)
>>> exp = Expression("1 + 2 / 5") >>> exp = Expression("1 + 2 / 5")
>>> for i in exp.simplify().explain(): >>> for i in exp.simplify().explain():
@ -246,9 +262,9 @@ des valeurs aléatoires (par défaut entre -10 et 10 et non nulles).
>>> form = "2* {a} + 3" >>> form = "2* {a} + 3"
>>> expression_aleatoire = Expression.random(form) >>> expression_aleatoire = Expression.random(form)
>>> print(expression_aleatoire) >>> print(expression_aleatoire)
'2 \times 9 + 3' '2 * 9 + 3'
>>> print(Expression.random(form,val_min = 30, val_max = 40)) >>> print(Expression.random(form,val_min = 30, val_max = 40))
'2 \times 31 + 3' '2 * 31 + 3'
Créer une expression avec conditions Créer une expression avec conditions
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -262,7 +278,7 @@ Parfois il peut être nécessaire d'imposer des conditions sur les
>>> conditions = ["abs({b}) != 1", "{d} > 1", "{b} != {d}", "gcd({a},{b}) == 1", "gcd({c},{d}) == 1"] >>> conditions = ["abs({b}) != 1", "{d} > 1", "{b} != {d}", "gcd({a},{b}) == 1", "gcd({c},{d}) == 1"]
>>> addition_fraction_alea = Expression.random(form, conditions) >>> addition_fraction_alea = Expression.random(form, conditions)
>>> print(addition_fraction_alea) >>> print(addition_fraction_alea)
'\frac{ 4 }{ 5 } + \frac{ 9 }{ 7 }' '4 / 5 + 9 / 7'
La méthode pour créer les valeurs avec des conditions est la méthode par La méthode pour créer les valeurs avec des conditions est la méthode par
rejet. Elle n'est pas très efficace et rien n'est encore prévu dans le rejet. Elle n'est pas très efficace et rien n'est encore prévu dans le
@ -280,7 +296,7 @@ possible de faire des calculs avec les valeurs générées.
>>> conditions = ["abs({b}) != 1", "{k} > 1", "{b} != {d}", "gcd({a},{b}) == 1", "gcd({c},{k*b}) == 1"] >>> conditions = ["abs({b}) != 1", "{k} > 1", "{b} != {d}", "gcd({a},{b}) == 1", "gcd({c},{k*b}) == 1"]
>>> random_frac_add_generator = RdExpression(form, conditions) >>> random_frac_add_generator = RdExpression(form, conditions)
>>> print(random_frac_add_generator()) >>> print(random_frac_add_generator())
\frac{ -9 }{ 7 } + \frac{ 1 }{ 28 } -9 / ( 7 ) + 1 / 28
Aléatoire sans rendu Aléatoire sans rendu
~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~
@ -288,13 +304,13 @@ Aléatoire sans rendu
On peut vouloir ne pas passer par la classe Expression pour obtenir On peut vouloir ne pas passer par la classe Expression pour obtenir
notre expression (si l'on veut utiliser la racine carré par exemple, ou notre expression (si l'on veut utiliser la racine carré par exemple, ou
pour créer n'importe quoi qui ne fait pas intervenir d'expression). pour créer n'importe quoi qui ne fait pas intervenir d'expression).
Ainsi pymath ne gère plus le rendu de l'expression ni son calcul. Ainsi mapytex ne gère plus le rendu de l'expression ni son calcul.
La fonction qui permet de faire cela est *random_str*: La fonction qui permet de faire cela est *random_str*:
.. code-block:: python .. code-block:: python
>>> from pymath import random_str >>> from mapytex import random_str
>>> form = "{a} / {b} + {c} / {k*b}" >>> form = "{a} / {b} + {c} / {k*b}"
>>> conditions = ["abs({b}) != 1", "{d} > 1", "{b} != {d}", "gcd({a},{b}) == 1", "gcd({c},{k*b}) == 1"] >>> conditions = ["abs({b}) != 1", "{d} > 1", "{b} != {d}", "gcd({a},{b}) == 1", "gcd({c},{k*b}) == 1"]
>>> str_addition_fraction = random_str(form, conditions) >>> str_addition_fraction = random_str(form, conditions)

View File

@ -3,7 +3,7 @@
from .calculus import Expression#, Polynom, Fraction, random_str, txt, Equation from .calculus import Expression#, Polynom, Fraction, random_str, txt, Equation
Expression.set_render('tex') #Expression.set_render('tex')
from .stat import Dataset, WeightedDataset from .stat import Dataset, WeightedDataset
from .geometry import random_pythagore from .geometry import random_pythagore