|
|
|
|
|
from sympy.concrete.products import Product |
|
|
from sympy.concrete.summations import Sum |
|
|
from sympy.core.add import Add |
|
|
from sympy.core.basic import Basic |
|
|
from sympy.core.containers import (Dict, Tuple) |
|
|
from sympy.core.function import (Derivative, Function, Lambda, Subs) |
|
|
from sympy.core.mul import Mul |
|
|
from sympy.core import (EulerGamma, GoldenRatio, Catalan) |
|
|
from sympy.core.numbers import (I, Rational, oo, pi) |
|
|
from sympy.core.power import Pow |
|
|
from sympy.core.relational import (Eq, Ge, Gt, Le, Lt, Ne) |
|
|
from sympy.core.singleton import S |
|
|
from sympy.core.symbol import (Symbol, symbols) |
|
|
from sympy.functions.elementary.complexes import conjugate |
|
|
from sympy.functions.elementary.exponential import LambertW |
|
|
from sympy.functions.special.bessel import (airyai, airyaiprime, airybi, airybiprime) |
|
|
from sympy.functions.special.delta_functions import Heaviside |
|
|
from sympy.functions.special.error_functions import (fresnelc, fresnels) |
|
|
from sympy.functions.special.singularity_functions import SingularityFunction |
|
|
from sympy.functions.special.zeta_functions import dirichlet_eta |
|
|
from sympy.geometry.line import (Ray, Segment) |
|
|
from sympy.integrals.integrals import Integral |
|
|
from sympy.logic.boolalg import (And, Equivalent, ITE, Implies, Nand, Nor, Not, Or, Xor) |
|
|
from sympy.matrices.dense import (Matrix, diag) |
|
|
from sympy.matrices.expressions.slice import MatrixSlice |
|
|
from sympy.matrices.expressions.trace import Trace |
|
|
from sympy.polys.domains.finitefield import FF |
|
|
from sympy.polys.domains.integerring import ZZ |
|
|
from sympy.polys.domains.rationalfield import QQ |
|
|
from sympy.polys.domains.realfield import RR |
|
|
from sympy.polys.orderings import (grlex, ilex) |
|
|
from sympy.polys.polytools import groebner |
|
|
from sympy.polys.rootoftools import (RootSum, rootof) |
|
|
from sympy.series.formal import fps |
|
|
from sympy.series.fourier import fourier_series |
|
|
from sympy.series.limits import Limit |
|
|
from sympy.series.order import O |
|
|
from sympy.series.sequences import (SeqAdd, SeqFormula, SeqMul, SeqPer) |
|
|
from sympy.sets.contains import Contains |
|
|
from sympy.sets.fancysets import Range |
|
|
from sympy.sets.sets import (Complement, FiniteSet, Intersection, Interval, Union) |
|
|
from sympy.codegen.ast import (Assignment, AddAugmentedAssignment, |
|
|
SubAugmentedAssignment, MulAugmentedAssignment, DivAugmentedAssignment, ModAugmentedAssignment) |
|
|
from sympy.core.expr import UnevaluatedExpr |
|
|
from sympy.physics.quantum.trace import Tr |
|
|
|
|
|
from sympy.functions import (Abs, Chi, Ci, Ei, KroneckerDelta, |
|
|
Piecewise, Shi, Si, atan2, beta, binomial, catalan, ceiling, cos, |
|
|
euler, exp, expint, factorial, factorial2, floor, gamma, hyper, log, |
|
|
meijerg, sin, sqrt, subfactorial, tan, uppergamma, lerchphi, polylog, |
|
|
elliptic_k, elliptic_f, elliptic_e, elliptic_pi, DiracDelta, bell, |
|
|
bernoulli, fibonacci, tribonacci, lucas, stieltjes, mathieuc, mathieus, |
|
|
mathieusprime, mathieucprime) |
|
|
|
|
|
from sympy.matrices import (Adjoint, Inverse, MatrixSymbol, Transpose, |
|
|
KroneckerProduct, BlockMatrix, OneMatrix, ZeroMatrix) |
|
|
from sympy.matrices.expressions import hadamard_power |
|
|
|
|
|
from sympy.physics import mechanics |
|
|
from sympy.physics.control.lti import (TransferFunction, Feedback, TransferFunctionMatrix, |
|
|
Series, Parallel, MIMOSeries, MIMOParallel, MIMOFeedback, StateSpace) |
|
|
from sympy.physics.units import joule, degree |
|
|
from sympy.printing.pretty import pprint, pretty as xpretty |
|
|
from sympy.printing.pretty.pretty_symbology import center_accent, is_combining, center |
|
|
from sympy.sets.conditionset import ConditionSet |
|
|
|
|
|
from sympy.sets import ImageSet, ProductSet |
|
|
from sympy.sets.setexpr import SetExpr |
|
|
from sympy.stats.crv_types import Normal |
|
|
from sympy.stats.symbolic_probability import (Covariance, Expectation, |
|
|
Probability, Variance) |
|
|
from sympy.tensor.array import (ImmutableDenseNDimArray, ImmutableSparseNDimArray, |
|
|
MutableDenseNDimArray, MutableSparseNDimArray, tensorproduct) |
|
|
from sympy.tensor.functions import TensorProduct |
|
|
from sympy.tensor.tensor import (TensorIndexType, tensor_indices, TensorHead, |
|
|
TensorElement, tensor_heads) |
|
|
|
|
|
from sympy.testing.pytest import raises, _both_exp_pow, warns_deprecated_sympy |
|
|
|
|
|
from sympy.vector import CoordSys3D, Gradient, Curl, Divergence, Dot, Cross, Laplacian |
|
|
|
|
|
|
|
|
|
|
|
import sympy as sym |
|
|
class lowergamma(sym.lowergamma): |
|
|
pass |
|
|
|
|
|
a, b, c, d, x, y, z, k, n, s, p = symbols('a,b,c,d,x,y,z,k,n,s,p') |
|
|
f = Function("f") |
|
|
th = Symbol('theta') |
|
|
ph = Symbol('phi') |
|
|
|
|
|
""" |
|
|
Expressions whose pretty-printing is tested here: |
|
|
(A '#' to the right of an expression indicates that its various acceptable |
|
|
orderings are accounted for by the tests.) |
|
|
|
|
|
|
|
|
BASIC EXPRESSIONS: |
|
|
|
|
|
oo |
|
|
(x**2) |
|
|
1/x |
|
|
y*x**-2 |
|
|
x**Rational(-5,2) |
|
|
(-2)**x |
|
|
Pow(3, 1, evaluate=False) |
|
|
(x**2 + x + 1) # |
|
|
1-x # |
|
|
1-2*x # |
|
|
x/y |
|
|
-x/y |
|
|
(x+2)/y # |
|
|
(1+x)*y #3 |
|
|
-5*x/(x+10) # correct placement of negative sign |
|
|
1 - Rational(3,2)*(x+1) |
|
|
-(-x + 5)*(-x - 2*sqrt(2) + 5) - (-y + 5)*(-y + 5) # issue 5524 |
|
|
|
|
|
|
|
|
ORDERING: |
|
|
|
|
|
x**2 + x + 1 |
|
|
1 - x |
|
|
1 - 2*x |
|
|
2*x**4 + y**2 - x**2 + y**3 |
|
|
|
|
|
|
|
|
RELATIONAL: |
|
|
|
|
|
Eq(x, y) |
|
|
Lt(x, y) |
|
|
Gt(x, y) |
|
|
Le(x, y) |
|
|
Ge(x, y) |
|
|
Ne(x/(y+1), y**2) # |
|
|
|
|
|
|
|
|
RATIONAL NUMBERS: |
|
|
|
|
|
y*x**-2 |
|
|
y**Rational(3,2) * x**Rational(-5,2) |
|
|
sin(x)**3/tan(x)**2 |
|
|
|
|
|
|
|
|
FUNCTIONS (ABS, CONJ, EXP, FUNCTION BRACES, FACTORIAL, FLOOR, CEILING): |
|
|
|
|
|
(2*x + exp(x)) # |
|
|
Abs(x) |
|
|
Abs(x/(x**2+1)) # |
|
|
Abs(1 / (y - Abs(x))) |
|
|
factorial(n) |
|
|
factorial(2*n) |
|
|
subfactorial(n) |
|
|
subfactorial(2*n) |
|
|
factorial(factorial(factorial(n))) |
|
|
factorial(n+1) # |
|
|
conjugate(x) |
|
|
conjugate(f(x+1)) # |
|
|
f(x) |
|
|
f(x, y) |
|
|
f(x/(y+1), y) # |
|
|
f(x**x**x**x**x**x) |
|
|
sin(x)**2 |
|
|
conjugate(a+b*I) |
|
|
conjugate(exp(a+b*I)) |
|
|
conjugate( f(1 + conjugate(f(x))) ) # |
|
|
f(x/(y+1), y) # denom of first arg |
|
|
floor(1 / (y - floor(x))) |
|
|
ceiling(1 / (y - ceiling(x))) |
|
|
|
|
|
|
|
|
SQRT: |
|
|
|
|
|
sqrt(2) |
|
|
2**Rational(1,3) |
|
|
2**Rational(1,1000) |
|
|
sqrt(x**2 + 1) |
|
|
(1 + sqrt(5))**Rational(1,3) |
|
|
2**(1/x) |
|
|
sqrt(2+pi) |
|
|
(2+(1+x**2)/(2+x))**Rational(1,4)+(1+x**Rational(1,1000))/sqrt(3+x**2) |
|
|
|
|
|
|
|
|
DERIVATIVES: |
|
|
|
|
|
Derivative(log(x), x, evaluate=False) |
|
|
Derivative(log(x), x, evaluate=False) + x # |
|
|
Derivative(log(x) + x**2, x, y, evaluate=False) |
|
|
Derivative(2*x*y, y, x, evaluate=False) + x**2 # |
|
|
beta(alpha).diff(alpha) |
|
|
|
|
|
|
|
|
INTEGRALS: |
|
|
|
|
|
Integral(log(x), x) |
|
|
Integral(x**2, x) |
|
|
Integral((sin(x))**2 / (tan(x))**2) |
|
|
Integral(x**(2**x), x) |
|
|
Integral(x**2, (x,1,2)) |
|
|
Integral(x**2, (x,Rational(1,2),10)) |
|
|
Integral(x**2*y**2, x,y) |
|
|
Integral(x**2, (x, None, 1)) |
|
|
Integral(x**2, (x, 1, None)) |
|
|
Integral(sin(th)/cos(ph), (th,0,pi), (ph, 0, 2*pi)) |
|
|
|
|
|
|
|
|
MATRICES: |
|
|
|
|
|
Matrix([[x**2+1, 1], [y, x+y]]) # |
|
|
Matrix([[x/y, y, th], [0, exp(I*k*ph), 1]]) |
|
|
|
|
|
|
|
|
PIECEWISE: |
|
|
|
|
|
Piecewise((x,x<1),(x**2,True)) |
|
|
|
|
|
ITE: |
|
|
|
|
|
ITE(x, y, z) |
|
|
|
|
|
SEQUENCES (TUPLES, LISTS, DICTIONARIES): |
|
|
|
|
|
() |
|
|
[] |
|
|
{} |
|
|
(1/x,) |
|
|
[x**2, 1/x, x, y, sin(th)**2/cos(ph)**2] |
|
|
(x**2, 1/x, x, y, sin(th)**2/cos(ph)**2) |
|
|
{x: sin(x)} |
|
|
{1/x: 1/y, x: sin(x)**2} # |
|
|
[x**2] |
|
|
(x**2,) |
|
|
{x**2: 1} |
|
|
|
|
|
|
|
|
LIMITS: |
|
|
|
|
|
Limit(x, x, oo) |
|
|
Limit(x**2, x, 0) |
|
|
Limit(1/x, x, 0) |
|
|
Limit(sin(x)/x, x, 0) |
|
|
|
|
|
|
|
|
UNITS: |
|
|
|
|
|
joule => kg*m**2/s |
|
|
|
|
|
|
|
|
SUBS: |
|
|
|
|
|
Subs(f(x), x, ph**2) |
|
|
Subs(f(x).diff(x), x, 0) |
|
|
Subs(f(x).diff(x)/y, (x, y), (0, Rational(1, 2))) |
|
|
|
|
|
|
|
|
ORDER: |
|
|
|
|
|
O(1) |
|
|
O(1/x) |
|
|
O(x**2 + y**2) |
|
|
|
|
|
""" |
|
|
|
|
|
|
|
|
def pretty(expr, order=None): |
|
|
"""ASCII pretty-printing""" |
|
|
return xpretty(expr, order=order, use_unicode=False, wrap_line=False) |
|
|
|
|
|
|
|
|
def upretty(expr, order=None): |
|
|
"""Unicode pretty-printing""" |
|
|
return xpretty(expr, order=order, use_unicode=True, wrap_line=False) |
|
|
|
|
|
|
|
|
def test_pretty_ascii_str(): |
|
|
assert pretty( 'xxx' ) == 'xxx' |
|
|
assert pretty( "xxx" ) == 'xxx' |
|
|
assert pretty( 'xxx\'xxx' ) == 'xxx\'xxx' |
|
|
assert pretty( 'xxx"xxx' ) == 'xxx\"xxx' |
|
|
assert pretty( 'xxx\"xxx' ) == 'xxx\"xxx' |
|
|
assert pretty( "xxx'xxx" ) == 'xxx\'xxx' |
|
|
assert pretty( "xxx\'xxx" ) == 'xxx\'xxx' |
|
|
assert pretty( "xxx\"xxx" ) == 'xxx\"xxx' |
|
|
assert pretty( "xxx\"xxx\'xxx" ) == 'xxx"xxx\'xxx' |
|
|
assert pretty( "xxx\nxxx" ) == 'xxx\nxxx' |
|
|
|
|
|
|
|
|
def test_pretty_unicode_str(): |
|
|
assert pretty( 'xxx' ) == 'xxx' |
|
|
assert pretty( 'xxx' ) == 'xxx' |
|
|
assert pretty( 'xxx\'xxx' ) == 'xxx\'xxx' |
|
|
assert pretty( 'xxx"xxx' ) == 'xxx\"xxx' |
|
|
assert pretty( 'xxx\"xxx' ) == 'xxx\"xxx' |
|
|
assert pretty( "xxx'xxx" ) == 'xxx\'xxx' |
|
|
assert pretty( "xxx\'xxx" ) == 'xxx\'xxx' |
|
|
assert pretty( "xxx\"xxx" ) == 'xxx\"xxx' |
|
|
assert pretty( "xxx\"xxx\'xxx" ) == 'xxx"xxx\'xxx' |
|
|
assert pretty( "xxx\nxxx" ) == 'xxx\nxxx' |
|
|
|
|
|
|
|
|
def test_upretty_greek(): |
|
|
assert upretty( oo ) == '∞' |
|
|
assert upretty( Symbol('alpha^+_1') ) == 'α⁺₁' |
|
|
assert upretty( Symbol('beta') ) == 'β' |
|
|
assert upretty(Symbol('lambda')) == 'λ' |
|
|
|
|
|
|
|
|
def test_upretty_multiindex(): |
|
|
assert upretty( Symbol('beta12') ) == 'β₁₂' |
|
|
assert upretty( Symbol('Y00') ) == 'Y₀₀' |
|
|
assert upretty( Symbol('Y_00') ) == 'Y₀₀' |
|
|
assert upretty( Symbol('F^+-') ) == 'F⁺⁻' |
|
|
|
|
|
|
|
|
def test_upretty_sub_super(): |
|
|
assert upretty( Symbol('beta_1_2') ) == 'β₁ ₂' |
|
|
assert upretty( Symbol('beta^1^2') ) == 'β¹ ²' |
|
|
assert upretty( Symbol('beta_1^2') ) == 'β²₁' |
|
|
assert upretty( Symbol('beta_10_20') ) == 'β₁₀ ₂₀' |
|
|
assert upretty( Symbol('beta_ax_gamma^i') ) == 'βⁱₐₓ ᵧ' |
|
|
assert upretty( Symbol("F^1^2_3_4") ) == 'F¹ ²₃ ₄' |
|
|
assert upretty( Symbol("F_1_2^3^4") ) == 'F³ ⁴₁ ₂' |
|
|
assert upretty( Symbol("F_1_2_3_4") ) == 'F₁ ₂ ₃ ₄' |
|
|
assert upretty( Symbol("F^1^2^3^4") ) == 'F¹ ² ³ ⁴' |
|
|
|
|
|
|
|
|
def test_upretty_subs_missing_in_24(): |
|
|
assert upretty( Symbol('F_beta') ) == 'Fᵦ' |
|
|
assert upretty( Symbol('F_gamma') ) == 'Fᵧ' |
|
|
assert upretty( Symbol('F_rho') ) == 'Fᵨ' |
|
|
assert upretty( Symbol('F_phi') ) == 'Fᵩ' |
|
|
assert upretty( Symbol('F_chi') ) == 'Fᵪ' |
|
|
|
|
|
assert upretty( Symbol('F_a') ) == 'Fₐ' |
|
|
assert upretty( Symbol('F_e') ) == 'Fₑ' |
|
|
assert upretty( Symbol('F_i') ) == 'Fᵢ' |
|
|
assert upretty( Symbol('F_o') ) == 'Fₒ' |
|
|
assert upretty( Symbol('F_u') ) == 'Fᵤ' |
|
|
assert upretty( Symbol('F_r') ) == 'Fᵣ' |
|
|
assert upretty( Symbol('F_v') ) == 'Fᵥ' |
|
|
assert upretty( Symbol('F_x') ) == 'Fₓ' |
|
|
|
|
|
|
|
|
def test_missing_in_2X_issue_9047(): |
|
|
assert upretty( Symbol('F_h') ) == 'Fₕ' |
|
|
assert upretty( Symbol('F_k') ) == 'Fₖ' |
|
|
assert upretty( Symbol('F_l') ) == 'Fₗ' |
|
|
assert upretty( Symbol('F_m') ) == 'Fₘ' |
|
|
assert upretty( Symbol('F_n') ) == 'Fₙ' |
|
|
assert upretty( Symbol('F_p') ) == 'Fₚ' |
|
|
assert upretty( Symbol('F_s') ) == 'Fₛ' |
|
|
assert upretty( Symbol('F_t') ) == 'Fₜ' |
|
|
|
|
|
|
|
|
def test_upretty_modifiers(): |
|
|
|
|
|
assert upretty( Symbol('Fmathring') ) == 'F̊' |
|
|
assert upretty( Symbol('Fddddot') ) == 'F⃜' |
|
|
assert upretty( Symbol('Fdddot') ) == 'F⃛' |
|
|
assert upretty( Symbol('Fddot') ) == 'F̈' |
|
|
assert upretty( Symbol('Fdot') ) == 'Ḟ' |
|
|
assert upretty( Symbol('Fcheck') ) == 'F̌' |
|
|
assert upretty( Symbol('Fbreve') ) == 'F̆' |
|
|
assert upretty( Symbol('Facute') ) == 'F́' |
|
|
assert upretty( Symbol('Fgrave') ) == 'F̀' |
|
|
assert upretty( Symbol('Ftilde') ) == 'F̃' |
|
|
assert upretty( Symbol('Fhat') ) == 'F̂' |
|
|
assert upretty( Symbol('Fbar') ) == 'F̅' |
|
|
assert upretty( Symbol('Fvec') ) == 'F⃗' |
|
|
assert upretty( Symbol('Fprime') ) == 'F′' |
|
|
assert upretty( Symbol('Fprm') ) == 'F′' |
|
|
|
|
|
assert upretty( Symbol('Fbold') ) == 'Fbold' |
|
|
assert upretty( Symbol('Fbm') ) == 'Fbm' |
|
|
assert upretty( Symbol('Fcal') ) == 'Fcal' |
|
|
assert upretty( Symbol('Fscr') ) == 'Fscr' |
|
|
assert upretty( Symbol('Ffrak') ) == 'Ffrak' |
|
|
|
|
|
assert upretty( Symbol('Fnorm') ) == '‖F‖' |
|
|
assert upretty( Symbol('Favg') ) == '⟨F⟩' |
|
|
assert upretty( Symbol('Fabs') ) == '|F|' |
|
|
assert upretty( Symbol('Fmag') ) == '|F|' |
|
|
|
|
|
assert upretty( Symbol('xvecdot') ) == 'x⃗̇' |
|
|
assert upretty( Symbol('xDotVec') ) == 'ẋ⃗' |
|
|
assert upretty( Symbol('xHATNorm') ) == '‖x̂‖' |
|
|
assert upretty( Symbol('xMathring_yCheckPRM__zbreveAbs') ) == 'x̊_y̌′__|z̆|' |
|
|
assert upretty( Symbol('alphadothat_nVECDOT__tTildePrime') ) == 'α̇̂_n⃗̇__t̃′' |
|
|
assert upretty( Symbol('x_dot') ) == 'x_dot' |
|
|
assert upretty( Symbol('x__dot') ) == 'x__dot' |
|
|
|
|
|
|
|
|
def test_pretty_Cycle(): |
|
|
from sympy.combinatorics.permutations import Cycle |
|
|
assert pretty(Cycle(1, 2)) == '(1 2)' |
|
|
assert pretty(Cycle(2)) == '(2)' |
|
|
assert pretty(Cycle(1, 3)(4, 5)) == '(1 3)(4 5)' |
|
|
assert pretty(Cycle()) == '()' |
|
|
|
|
|
|
|
|
def test_pretty_Permutation(): |
|
|
from sympy.combinatorics.permutations import Permutation |
|
|
p1 = Permutation(1, 2)(3, 4) |
|
|
assert xpretty(p1, perm_cyclic=True, use_unicode=True) == "(1 2)(3 4)" |
|
|
assert xpretty(p1, perm_cyclic=True, use_unicode=False) == "(1 2)(3 4)" |
|
|
assert xpretty(p1, perm_cyclic=False, use_unicode=True) == \ |
|
|
'⎛0 1 2 3 4⎞\n'\ |
|
|
'⎝0 2 1 4 3⎠' |
|
|
assert xpretty(p1, perm_cyclic=False, use_unicode=False) == \ |
|
|
"/0 1 2 3 4\\\n"\ |
|
|
"\\0 2 1 4 3/" |
|
|
|
|
|
with warns_deprecated_sympy(): |
|
|
old_print_cyclic = Permutation.print_cyclic |
|
|
Permutation.print_cyclic = False |
|
|
assert xpretty(p1, use_unicode=True) == \ |
|
|
'⎛0 1 2 3 4⎞\n'\ |
|
|
'⎝0 2 1 4 3⎠' |
|
|
assert xpretty(p1, use_unicode=False) == \ |
|
|
"/0 1 2 3 4\\\n"\ |
|
|
"\\0 2 1 4 3/" |
|
|
Permutation.print_cyclic = old_print_cyclic |
|
|
|
|
|
|
|
|
def test_pretty_basic(): |
|
|
assert pretty( -Rational(1)/2 ) == '-1/2' |
|
|
assert pretty( -Rational(13)/22 ) == \ |
|
|
"""\ |
|
|
-13 \n\ |
|
|
----\n\ |
|
|
22 \ |
|
|
""" |
|
|
expr = oo |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
oo\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
∞\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = (x**2) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2\n\ |
|
|
x \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
2\n\ |
|
|
x \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = 1/x |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
1\n\ |
|
|
-\n\ |
|
|
x\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
1\n\ |
|
|
─\n\ |
|
|
x\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
expr = x**-1.0 |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
-1.0\n\ |
|
|
x \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
-1.0\n\ |
|
|
x \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
expr = Pow(S(2), -1.0, evaluate=False) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
-1.0\n\ |
|
|
2 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
-1.0\n\ |
|
|
2 \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = y*x**-2 |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
y \n\ |
|
|
--\n\ |
|
|
2\n\ |
|
|
x \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
y \n\ |
|
|
──\n\ |
|
|
2\n\ |
|
|
x \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
expr = x**Rational(1, 3) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
1/3\n\ |
|
|
x \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
1/3\n\ |
|
|
x \ |
|
|
""" |
|
|
assert xpretty(expr, use_unicode=False, wrap_line=False,\ |
|
|
root_notation = False) == ascii_str |
|
|
assert xpretty(expr, use_unicode=True, wrap_line=False,\ |
|
|
root_notation = False) == ucode_str |
|
|
|
|
|
expr = x**Rational(-5, 2) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
1 \n\ |
|
|
----\n\ |
|
|
5/2\n\ |
|
|
x \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
1 \n\ |
|
|
────\n\ |
|
|
5/2\n\ |
|
|
x \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = (-2)**x |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
x\n\ |
|
|
(-2) \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
x\n\ |
|
|
(-2) \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
expr = Pow(3, 1, evaluate=False) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
1\n\ |
|
|
3 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
1\n\ |
|
|
3 \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = (x**2 + x + 1) |
|
|
ascii_str_1 = \ |
|
|
"""\ |
|
|
2\n\ |
|
|
1 + x + x \ |
|
|
""" |
|
|
ascii_str_2 = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
x + x + 1\ |
|
|
""" |
|
|
ascii_str_3 = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
x + 1 + x\ |
|
|
""" |
|
|
ucode_str_1 = \ |
|
|
"""\ |
|
|
2\n\ |
|
|
1 + x + x \ |
|
|
""" |
|
|
ucode_str_2 = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
x + x + 1\ |
|
|
""" |
|
|
ucode_str_3 = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
x + 1 + x\ |
|
|
""" |
|
|
assert pretty(expr) in [ascii_str_1, ascii_str_2, ascii_str_3] |
|
|
assert upretty(expr) in [ucode_str_1, ucode_str_2, ucode_str_3] |
|
|
|
|
|
expr = 1 - x |
|
|
ascii_str_1 = \ |
|
|
"""\ |
|
|
1 - x\ |
|
|
""" |
|
|
ascii_str_2 = \ |
|
|
"""\ |
|
|
-x + 1\ |
|
|
""" |
|
|
ucode_str_1 = \ |
|
|
"""\ |
|
|
1 - x\ |
|
|
""" |
|
|
ucode_str_2 = \ |
|
|
"""\ |
|
|
-x + 1\ |
|
|
""" |
|
|
assert pretty(expr) in [ascii_str_1, ascii_str_2] |
|
|
assert upretty(expr) in [ucode_str_1, ucode_str_2] |
|
|
|
|
|
expr = 1 - 2*x |
|
|
ascii_str_1 = \ |
|
|
"""\ |
|
|
1 - 2*x\ |
|
|
""" |
|
|
ascii_str_2 = \ |
|
|
"""\ |
|
|
-2*x + 1\ |
|
|
""" |
|
|
ucode_str_1 = \ |
|
|
"""\ |
|
|
1 - 2⋅x\ |
|
|
""" |
|
|
ucode_str_2 = \ |
|
|
"""\ |
|
|
-2⋅x + 1\ |
|
|
""" |
|
|
assert pretty(expr) in [ascii_str_1, ascii_str_2] |
|
|
assert upretty(expr) in [ucode_str_1, ucode_str_2] |
|
|
|
|
|
expr = x/y |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
x\n\ |
|
|
-\n\ |
|
|
y\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
x\n\ |
|
|
─\n\ |
|
|
y\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = -x/y |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
-x \n\ |
|
|
---\n\ |
|
|
y \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
-x \n\ |
|
|
───\n\ |
|
|
y \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = (x + 2)/y |
|
|
ascii_str_1 = \ |
|
|
"""\ |
|
|
2 + x\n\ |
|
|
-----\n\ |
|
|
y \ |
|
|
""" |
|
|
ascii_str_2 = \ |
|
|
"""\ |
|
|
x + 2\n\ |
|
|
-----\n\ |
|
|
y \ |
|
|
""" |
|
|
ucode_str_1 = \ |
|
|
"""\ |
|
|
2 + x\n\ |
|
|
─────\n\ |
|
|
y \ |
|
|
""" |
|
|
ucode_str_2 = \ |
|
|
"""\ |
|
|
x + 2\n\ |
|
|
─────\n\ |
|
|
y \ |
|
|
""" |
|
|
assert pretty(expr) in [ascii_str_1, ascii_str_2] |
|
|
assert upretty(expr) in [ucode_str_1, ucode_str_2] |
|
|
|
|
|
expr = (1 + x)*y |
|
|
ascii_str_1 = \ |
|
|
"""\ |
|
|
y*(1 + x)\ |
|
|
""" |
|
|
ascii_str_2 = \ |
|
|
"""\ |
|
|
(1 + x)*y\ |
|
|
""" |
|
|
ascii_str_3 = \ |
|
|
"""\ |
|
|
y*(x + 1)\ |
|
|
""" |
|
|
ucode_str_1 = \ |
|
|
"""\ |
|
|
y⋅(1 + x)\ |
|
|
""" |
|
|
ucode_str_2 = \ |
|
|
"""\ |
|
|
(1 + x)⋅y\ |
|
|
""" |
|
|
ucode_str_3 = \ |
|
|
"""\ |
|
|
y⋅(x + 1)\ |
|
|
""" |
|
|
assert pretty(expr) in [ascii_str_1, ascii_str_2, ascii_str_3] |
|
|
assert upretty(expr) in [ucode_str_1, ucode_str_2, ucode_str_3] |
|
|
|
|
|
|
|
|
expr = -5*x/(x + 10) |
|
|
ascii_str_1 = \ |
|
|
"""\ |
|
|
-5*x \n\ |
|
|
------\n\ |
|
|
10 + x\ |
|
|
""" |
|
|
ascii_str_2 = \ |
|
|
"""\ |
|
|
-5*x \n\ |
|
|
------\n\ |
|
|
x + 10\ |
|
|
""" |
|
|
ucode_str_1 = \ |
|
|
"""\ |
|
|
-5⋅x \n\ |
|
|
──────\n\ |
|
|
10 + x\ |
|
|
""" |
|
|
ucode_str_2 = \ |
|
|
"""\ |
|
|
-5⋅x \n\ |
|
|
──────\n\ |
|
|
x + 10\ |
|
|
""" |
|
|
assert pretty(expr) in [ascii_str_1, ascii_str_2] |
|
|
assert upretty(expr) in [ucode_str_1, ucode_str_2] |
|
|
|
|
|
expr = -S.Half - 3*x |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
-3*x - 1/2\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
-3⋅x - 1/2\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = S.Half - 3*x |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
1/2 - 3*x\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
1/2 - 3⋅x\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = -S.Half - 3*x/2 |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
3*x 1\n\ |
|
|
- --- - -\n\ |
|
|
2 2\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
3⋅x 1\n\ |
|
|
- ─── - ─\n\ |
|
|
2 2\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = S.Half - 3*x/2 |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
1 3*x\n\ |
|
|
- - ---\n\ |
|
|
2 2 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
1 3⋅x\n\ |
|
|
─ - ───\n\ |
|
|
2 2 \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_negative_fractions(): |
|
|
expr = -x/y |
|
|
ascii_str =\ |
|
|
"""\ |
|
|
-x \n\ |
|
|
---\n\ |
|
|
y \ |
|
|
""" |
|
|
ucode_str =\ |
|
|
"""\ |
|
|
-x \n\ |
|
|
───\n\ |
|
|
y \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
expr = -x*z/y |
|
|
ascii_str =\ |
|
|
"""\ |
|
|
-x*z \n\ |
|
|
-----\n\ |
|
|
y \ |
|
|
""" |
|
|
ucode_str =\ |
|
|
"""\ |
|
|
-x⋅z \n\ |
|
|
─────\n\ |
|
|
y \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
expr = x**2/y |
|
|
ascii_str =\ |
|
|
"""\ |
|
|
2\n\ |
|
|
x \n\ |
|
|
--\n\ |
|
|
y \ |
|
|
""" |
|
|
ucode_str =\ |
|
|
"""\ |
|
|
2\n\ |
|
|
x \n\ |
|
|
──\n\ |
|
|
y \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
expr = -x**2/y |
|
|
ascii_str =\ |
|
|
"""\ |
|
|
2 \n\ |
|
|
-x \n\ |
|
|
----\n\ |
|
|
y \ |
|
|
""" |
|
|
ucode_str =\ |
|
|
"""\ |
|
|
2 \n\ |
|
|
-x \n\ |
|
|
────\n\ |
|
|
y \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
expr = -x/(y*z) |
|
|
ascii_str =\ |
|
|
"""\ |
|
|
-x \n\ |
|
|
---\n\ |
|
|
y*z\ |
|
|
""" |
|
|
ucode_str =\ |
|
|
"""\ |
|
|
-x \n\ |
|
|
───\n\ |
|
|
y⋅z\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
expr = -a/y**2 |
|
|
ascii_str =\ |
|
|
"""\ |
|
|
-a \n\ |
|
|
---\n\ |
|
|
2 \n\ |
|
|
y \ |
|
|
""" |
|
|
ucode_str =\ |
|
|
"""\ |
|
|
-a \n\ |
|
|
───\n\ |
|
|
2 \n\ |
|
|
y \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
expr = y**(-a/b) |
|
|
ascii_str =\ |
|
|
"""\ |
|
|
-a \n\ |
|
|
---\n\ |
|
|
b \n\ |
|
|
y \ |
|
|
""" |
|
|
ucode_str =\ |
|
|
"""\ |
|
|
-a \n\ |
|
|
───\n\ |
|
|
b \n\ |
|
|
y \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
expr = -1/y**2 |
|
|
ascii_str =\ |
|
|
"""\ |
|
|
-1 \n\ |
|
|
---\n\ |
|
|
2 \n\ |
|
|
y \ |
|
|
""" |
|
|
ucode_str =\ |
|
|
"""\ |
|
|
-1 \n\ |
|
|
───\n\ |
|
|
2 \n\ |
|
|
y \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
expr = -10/b**2 |
|
|
ascii_str =\ |
|
|
"""\ |
|
|
-10 \n\ |
|
|
----\n\ |
|
|
2 \n\ |
|
|
b \ |
|
|
""" |
|
|
ucode_str =\ |
|
|
"""\ |
|
|
-10 \n\ |
|
|
────\n\ |
|
|
2 \n\ |
|
|
b \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
expr = Rational(-200, 37) |
|
|
ascii_str =\ |
|
|
"""\ |
|
|
-200 \n\ |
|
|
-----\n\ |
|
|
37 \ |
|
|
""" |
|
|
ucode_str =\ |
|
|
"""\ |
|
|
-200 \n\ |
|
|
─────\n\ |
|
|
37 \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_Mul(): |
|
|
expr = Mul(0, 1, evaluate=False) |
|
|
assert pretty(expr) == "0*1" |
|
|
assert upretty(expr) == "0⋅1" |
|
|
expr = Mul(1, 0, evaluate=False) |
|
|
assert pretty(expr) == "1*0" |
|
|
assert upretty(expr) == "1⋅0" |
|
|
expr = Mul(1, 1, evaluate=False) |
|
|
assert pretty(expr) == "1*1" |
|
|
assert upretty(expr) == "1⋅1" |
|
|
expr = Mul(1, 1, 1, evaluate=False) |
|
|
assert pretty(expr) == "1*1*1" |
|
|
assert upretty(expr) == "1⋅1⋅1" |
|
|
expr = Mul(1, 2, evaluate=False) |
|
|
assert pretty(expr) == "1*2" |
|
|
assert upretty(expr) == "1⋅2" |
|
|
expr = Add(0, 1, evaluate=False) |
|
|
assert pretty(expr) == "0 + 1" |
|
|
assert upretty(expr) == "0 + 1" |
|
|
expr = Mul(1, 1, 2, evaluate=False) |
|
|
assert pretty(expr) == "1*1*2" |
|
|
assert upretty(expr) == "1⋅1⋅2" |
|
|
expr = Add(0, 0, 1, evaluate=False) |
|
|
assert pretty(expr) == "0 + 0 + 1" |
|
|
assert upretty(expr) == "0 + 0 + 1" |
|
|
expr = Mul(1, -1, evaluate=False) |
|
|
assert pretty(expr) == "1*-1" |
|
|
assert upretty(expr) == "1⋅-1" |
|
|
expr = Mul(1.0, x, evaluate=False) |
|
|
assert pretty(expr) == "1.0*x" |
|
|
assert upretty(expr) == "1.0⋅x" |
|
|
expr = Mul(1, 1, 2, 3, x, evaluate=False) |
|
|
assert pretty(expr) == "1*1*2*3*x" |
|
|
assert upretty(expr) == "1⋅1⋅2⋅3⋅x" |
|
|
expr = Mul(-1, 1, evaluate=False) |
|
|
assert pretty(expr) == "-1*1" |
|
|
assert upretty(expr) == "-1⋅1" |
|
|
expr = Mul(4, 3, 2, 1, 0, y, x, evaluate=False) |
|
|
assert pretty(expr) == "4*3*2*1*0*y*x" |
|
|
assert upretty(expr) == "4⋅3⋅2⋅1⋅0⋅y⋅x" |
|
|
expr = Mul(4, 3, 2, 1+z, 0, y, x, evaluate=False) |
|
|
assert pretty(expr) == "4*3*2*(z + 1)*0*y*x" |
|
|
assert upretty(expr) == "4⋅3⋅2⋅(z + 1)⋅0⋅y⋅x" |
|
|
expr = Mul(Rational(2, 3), Rational(5, 7), evaluate=False) |
|
|
assert pretty(expr) == "2/3*5/7" |
|
|
assert upretty(expr) == "2/3⋅5/7" |
|
|
expr = Mul(x + y, Rational(1, 2), evaluate=False) |
|
|
assert pretty(expr) == "(x + y)*1/2" |
|
|
assert upretty(expr) == "(x + y)⋅1/2" |
|
|
expr = Mul(Rational(1, 2), x + y, evaluate=False) |
|
|
assert pretty(expr) == "x + y\n-----\n 2 " |
|
|
assert upretty(expr) == "x + y\n─────\n 2 " |
|
|
expr = Mul(S.One, x + y, evaluate=False) |
|
|
assert pretty(expr) == "1*(x + y)" |
|
|
assert upretty(expr) == "1⋅(x + y)" |
|
|
expr = Mul(x - y, S.One, evaluate=False) |
|
|
assert pretty(expr) == "(x - y)*1" |
|
|
assert upretty(expr) == "(x - y)⋅1" |
|
|
expr = Mul(Rational(1, 2), x - y, S.One, x + y, evaluate=False) |
|
|
assert pretty(expr) == "1/2*(x - y)*1*(x + y)" |
|
|
assert upretty(expr) == "1/2⋅(x - y)⋅1⋅(x + y)" |
|
|
expr = Mul(x + y, Rational(3, 4), S.One, y - z, evaluate=False) |
|
|
assert pretty(expr) == "(x + y)*3/4*1*(y - z)" |
|
|
assert upretty(expr) == "(x + y)⋅3/4⋅1⋅(y - z)" |
|
|
expr = Mul(x + y, Rational(1, 1), Rational(3, 4), Rational(5, 6),evaluate=False) |
|
|
assert pretty(expr) == "(x + y)*1*3/4*5/6" |
|
|
assert upretty(expr) == "(x + y)⋅1⋅3/4⋅5/6" |
|
|
expr = Mul(Rational(3, 4), x + y, S.One, y - z, evaluate=False) |
|
|
assert pretty(expr) == "3/4*(x + y)*1*(y - z)" |
|
|
assert upretty(expr) == "3/4⋅(x + y)⋅1⋅(y - z)" |
|
|
|
|
|
|
|
|
def test_issue_5524(): |
|
|
assert pretty(-(-x + 5)*(-x - 2*sqrt(2) + 5) - (-y + 5)*(-y + 5)) == \ |
|
|
"""\ |
|
|
2 / ___ \\\n\ |
|
|
- (5 - y) + (x - 5)*\\-x - 2*\\/ 2 + 5/\ |
|
|
""" |
|
|
|
|
|
assert upretty(-(-x + 5)*(-x - 2*sqrt(2) + 5) - (-y + 5)*(-y + 5)) == \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
- (5 - y) + (x - 5)⋅(-x - 2⋅√2 + 5)\ |
|
|
""" |
|
|
|
|
|
|
|
|
def test_pretty_ordering(): |
|
|
assert pretty(x**2 + x + 1, order='lex') == \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
x + x + 1\ |
|
|
""" |
|
|
assert pretty(x**2 + x + 1, order='rev-lex') == \ |
|
|
"""\ |
|
|
2\n\ |
|
|
1 + x + x \ |
|
|
""" |
|
|
assert pretty(1 - x, order='lex') == '-x + 1' |
|
|
assert pretty(1 - x, order='rev-lex') == '1 - x' |
|
|
|
|
|
assert pretty(1 - 2*x, order='lex') == '-2*x + 1' |
|
|
assert pretty(1 - 2*x, order='rev-lex') == '1 - 2*x' |
|
|
|
|
|
f = 2*x**4 + y**2 - x**2 + y**3 |
|
|
assert pretty(f, order=None) == \ |
|
|
"""\ |
|
|
4 2 3 2\n\ |
|
|
2*x - x + y + y \ |
|
|
""" |
|
|
assert pretty(f, order='lex') == \ |
|
|
"""\ |
|
|
4 2 3 2\n\ |
|
|
2*x - x + y + y \ |
|
|
""" |
|
|
assert pretty(f, order='rev-lex') == \ |
|
|
"""\ |
|
|
2 3 2 4\n\ |
|
|
y + y - x + 2*x \ |
|
|
""" |
|
|
|
|
|
expr = x - x**3/6 + x**5/120 + O(x**6) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
3 5 \n\ |
|
|
x x / 6\\\n\ |
|
|
x - -- + --- + O\\x /\n\ |
|
|
6 120 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
3 5 \n\ |
|
|
x x ⎛ 6⎞\n\ |
|
|
x - ── + ─── + O⎝x ⎠\n\ |
|
|
6 120 \ |
|
|
""" |
|
|
assert pretty(expr, order=None) == ascii_str |
|
|
assert upretty(expr, order=None) == ucode_str |
|
|
|
|
|
assert pretty(expr, order='lex') == ascii_str |
|
|
assert upretty(expr, order='lex') == ucode_str |
|
|
|
|
|
assert pretty(expr, order='rev-lex') == ascii_str |
|
|
assert upretty(expr, order='rev-lex') == ucode_str |
|
|
|
|
|
|
|
|
def test_EulerGamma(): |
|
|
assert pretty(EulerGamma) == str(EulerGamma) == "EulerGamma" |
|
|
assert upretty(EulerGamma) == "γ" |
|
|
|
|
|
|
|
|
def test_GoldenRatio(): |
|
|
assert pretty(GoldenRatio) == str(GoldenRatio) == "GoldenRatio" |
|
|
assert upretty(GoldenRatio) == "φ" |
|
|
|
|
|
|
|
|
def test_Catalan(): |
|
|
assert pretty(Catalan) == upretty(Catalan) == "G" |
|
|
|
|
|
|
|
|
def test_pretty_relational(): |
|
|
expr = Eq(x, y) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
x = y\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
x = y\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Lt(x, y) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
x < y\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
x < y\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Gt(x, y) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
x > y\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
x > y\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Le(x, y) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
x <= y\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
x ≤ y\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Ge(x, y) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
x >= y\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
x ≥ y\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Ne(x/(y + 1), y**2) |
|
|
ascii_str_1 = \ |
|
|
"""\ |
|
|
x 2\n\ |
|
|
----- != y \n\ |
|
|
1 + y \ |
|
|
""" |
|
|
ascii_str_2 = \ |
|
|
"""\ |
|
|
x 2\n\ |
|
|
----- != y \n\ |
|
|
y + 1 \ |
|
|
""" |
|
|
ucode_str_1 = \ |
|
|
"""\ |
|
|
x 2\n\ |
|
|
───── ≠ y \n\ |
|
|
1 + y \ |
|
|
""" |
|
|
ucode_str_2 = \ |
|
|
"""\ |
|
|
x 2\n\ |
|
|
───── ≠ y \n\ |
|
|
y + 1 \ |
|
|
""" |
|
|
assert pretty(expr) in [ascii_str_1, ascii_str_2] |
|
|
assert upretty(expr) in [ucode_str_1, ucode_str_2] |
|
|
|
|
|
|
|
|
def test_Assignment(): |
|
|
expr = Assignment(x, y) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
x := y\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
x := y\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_AugmentedAssignment(): |
|
|
expr = AddAugmentedAssignment(x, y) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
x += y\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
x += y\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = SubAugmentedAssignment(x, y) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
x -= y\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
x -= y\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = MulAugmentedAssignment(x, y) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
x *= y\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
x *= y\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = DivAugmentedAssignment(x, y) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
x /= y\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
x /= y\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = ModAugmentedAssignment(x, y) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
x %= y\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
x %= y\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_pretty_rational(): |
|
|
expr = y*x**-2 |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
y \n\ |
|
|
--\n\ |
|
|
2\n\ |
|
|
x \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
y \n\ |
|
|
──\n\ |
|
|
2\n\ |
|
|
x \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = y**Rational(3, 2) * x**Rational(-5, 2) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
3/2\n\ |
|
|
y \n\ |
|
|
----\n\ |
|
|
5/2\n\ |
|
|
x \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
3/2\n\ |
|
|
y \n\ |
|
|
────\n\ |
|
|
5/2\n\ |
|
|
x \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = sin(x)**3/tan(x)**2 |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
3 \n\ |
|
|
sin (x)\n\ |
|
|
-------\n\ |
|
|
2 \n\ |
|
|
tan (x)\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
3 \n\ |
|
|
sin (x)\n\ |
|
|
───────\n\ |
|
|
2 \n\ |
|
|
tan (x)\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
@_both_exp_pow |
|
|
def test_pretty_functions(): |
|
|
"""Tests for Abs, conjugate, exp, function braces, and factorial.""" |
|
|
expr = (2*x + exp(x)) |
|
|
ascii_str_1 = \ |
|
|
"""\ |
|
|
x\n\ |
|
|
2*x + e \ |
|
|
""" |
|
|
ascii_str_2 = \ |
|
|
"""\ |
|
|
x \n\ |
|
|
e + 2*x\ |
|
|
""" |
|
|
ucode_str_1 = \ |
|
|
"""\ |
|
|
x\n\ |
|
|
2⋅x + ℯ \ |
|
|
""" |
|
|
ucode_str_2 = \ |
|
|
"""\ |
|
|
x \n\ |
|
|
ℯ + 2⋅x\ |
|
|
""" |
|
|
ucode_str_3 = \ |
|
|
"""\ |
|
|
x \n\ |
|
|
ℯ + 2⋅x\ |
|
|
""" |
|
|
assert pretty(expr) in [ascii_str_1, ascii_str_2] |
|
|
assert upretty(expr) in [ucode_str_1, ucode_str_2, ucode_str_3] |
|
|
|
|
|
expr = Abs(x) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
|x|\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
│x│\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Abs(x/(x**2 + 1)) |
|
|
ascii_str_1 = \ |
|
|
"""\ |
|
|
| x |\n\ |
|
|
|------|\n\ |
|
|
| 2|\n\ |
|
|
|1 + x |\ |
|
|
""" |
|
|
ascii_str_2 = \ |
|
|
"""\ |
|
|
| x |\n\ |
|
|
|------|\n\ |
|
|
| 2 |\n\ |
|
|
|x + 1|\ |
|
|
""" |
|
|
ucode_str_1 = \ |
|
|
"""\ |
|
|
│ x │\n\ |
|
|
│──────│\n\ |
|
|
│ 2│\n\ |
|
|
│1 + x │\ |
|
|
""" |
|
|
ucode_str_2 = \ |
|
|
"""\ |
|
|
│ x │\n\ |
|
|
│──────│\n\ |
|
|
│ 2 │\n\ |
|
|
│x + 1│\ |
|
|
""" |
|
|
assert pretty(expr) in [ascii_str_1, ascii_str_2] |
|
|
assert upretty(expr) in [ucode_str_1, ucode_str_2] |
|
|
|
|
|
expr = Abs(1 / (y - Abs(x))) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
1 \n\ |
|
|
---------\n\ |
|
|
|y - |x||\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
1 \n\ |
|
|
─────────\n\ |
|
|
│y - │x││\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
n = Symbol('n', integer=True) |
|
|
expr = factorial(n) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
n!\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
n!\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = factorial(2*n) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
(2*n)!\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
(2⋅n)!\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = factorial(factorial(factorial(n))) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
((n!)!)!\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
((n!)!)!\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = factorial(n + 1) |
|
|
ascii_str_1 = \ |
|
|
"""\ |
|
|
(1 + n)!\ |
|
|
""" |
|
|
ascii_str_2 = \ |
|
|
"""\ |
|
|
(n + 1)!\ |
|
|
""" |
|
|
ucode_str_1 = \ |
|
|
"""\ |
|
|
(1 + n)!\ |
|
|
""" |
|
|
ucode_str_2 = \ |
|
|
"""\ |
|
|
(n + 1)!\ |
|
|
""" |
|
|
|
|
|
assert pretty(expr) in [ascii_str_1, ascii_str_2] |
|
|
assert upretty(expr) in [ucode_str_1, ucode_str_2] |
|
|
|
|
|
expr = subfactorial(n) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
!n\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
!n\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = subfactorial(2*n) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
!(2*n)\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
!(2⋅n)\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
n = Symbol('n', integer=True) |
|
|
expr = factorial2(n) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
n!!\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
n!!\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = factorial2(2*n) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
(2*n)!!\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
(2⋅n)!!\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = factorial2(factorial2(factorial2(n))) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
((n!!)!!)!!\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
((n!!)!!)!!\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = factorial2(n + 1) |
|
|
ascii_str_1 = \ |
|
|
"""\ |
|
|
(1 + n)!!\ |
|
|
""" |
|
|
ascii_str_2 = \ |
|
|
"""\ |
|
|
(n + 1)!!\ |
|
|
""" |
|
|
ucode_str_1 = \ |
|
|
"""\ |
|
|
(1 + n)!!\ |
|
|
""" |
|
|
ucode_str_2 = \ |
|
|
"""\ |
|
|
(n + 1)!!\ |
|
|
""" |
|
|
|
|
|
assert pretty(expr) in [ascii_str_1, ascii_str_2] |
|
|
assert upretty(expr) in [ucode_str_1, ucode_str_2] |
|
|
|
|
|
expr = 2*binomial(n, k) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/n\\\n\ |
|
|
2*| |\n\ |
|
|
\\k/\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛n⎞\n\ |
|
|
2⋅⎜ ⎟\n\ |
|
|
⎝k⎠\ |
|
|
""" |
|
|
|
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = 2*binomial(2*n, k) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/2*n\\\n\ |
|
|
2*| |\n\ |
|
|
\\ k /\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛2⋅n⎞\n\ |
|
|
2⋅⎜ ⎟\n\ |
|
|
⎝ k ⎠\ |
|
|
""" |
|
|
|
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = 2*binomial(n**2, k) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ 2\\\n\ |
|
|
|n |\n\ |
|
|
2*| |\n\ |
|
|
\\k /\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛ 2⎞\n\ |
|
|
⎜n ⎟\n\ |
|
|
2⋅⎜ ⎟\n\ |
|
|
⎝k ⎠\ |
|
|
""" |
|
|
|
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = catalan(n) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
C \n\ |
|
|
n\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
C \n\ |
|
|
n\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = catalan(n) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
C \n\ |
|
|
n\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
C \n\ |
|
|
n\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = bell(n) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
B \n\ |
|
|
n\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
B \n\ |
|
|
n\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = bernoulli(n) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
B \n\ |
|
|
n\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
B \n\ |
|
|
n\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = bernoulli(n, x) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
B (x)\n\ |
|
|
n \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
B (x)\n\ |
|
|
n \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = fibonacci(n) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
F \n\ |
|
|
n\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
F \n\ |
|
|
n\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = lucas(n) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
L \n\ |
|
|
n\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
L \n\ |
|
|
n\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = tribonacci(n) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
T \n\ |
|
|
n\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
T \n\ |
|
|
n\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = stieltjes(n) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
stieltjes \n\ |
|
|
n\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
γ \n\ |
|
|
n\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = stieltjes(n, x) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
stieltjes (x)\n\ |
|
|
n \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
γ (x)\n\ |
|
|
n \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = mathieuc(x, y, z) |
|
|
ascii_str = 'C(x, y, z)' |
|
|
ucode_str = 'C(x, y, z)' |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = mathieus(x, y, z) |
|
|
ascii_str = 'S(x, y, z)' |
|
|
ucode_str = 'S(x, y, z)' |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = mathieucprime(x, y, z) |
|
|
ascii_str = "C'(x, y, z)" |
|
|
ucode_str = "C'(x, y, z)" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = mathieusprime(x, y, z) |
|
|
ascii_str = "S'(x, y, z)" |
|
|
ucode_str = "S'(x, y, z)" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = conjugate(x) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
_\n\ |
|
|
x\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
_\n\ |
|
|
x\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
f = Function('f') |
|
|
expr = conjugate(f(x + 1)) |
|
|
ascii_str_1 = \ |
|
|
"""\ |
|
|
________\n\ |
|
|
f(1 + x)\ |
|
|
""" |
|
|
ascii_str_2 = \ |
|
|
"""\ |
|
|
________\n\ |
|
|
f(x + 1)\ |
|
|
""" |
|
|
ucode_str_1 = \ |
|
|
"""\ |
|
|
________\n\ |
|
|
f(1 + x)\ |
|
|
""" |
|
|
ucode_str_2 = \ |
|
|
"""\ |
|
|
________\n\ |
|
|
f(x + 1)\ |
|
|
""" |
|
|
assert pretty(expr) in [ascii_str_1, ascii_str_2] |
|
|
assert upretty(expr) in [ucode_str_1, ucode_str_2] |
|
|
|
|
|
expr = f(x) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
f(x)\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
f(x)\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = f(x, y) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
f(x, y)\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
f(x, y)\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = f(x/(y + 1), y) |
|
|
ascii_str_1 = \ |
|
|
"""\ |
|
|
/ x \\\n\ |
|
|
f|-----, y|\n\ |
|
|
\\1 + y /\ |
|
|
""" |
|
|
ascii_str_2 = \ |
|
|
"""\ |
|
|
/ x \\\n\ |
|
|
f|-----, y|\n\ |
|
|
\\y + 1 /\ |
|
|
""" |
|
|
ucode_str_1 = \ |
|
|
"""\ |
|
|
⎛ x ⎞\n\ |
|
|
f⎜─────, y⎟\n\ |
|
|
⎝1 + y ⎠\ |
|
|
""" |
|
|
ucode_str_2 = \ |
|
|
"""\ |
|
|
⎛ x ⎞\n\ |
|
|
f⎜─────, y⎟\n\ |
|
|
⎝y + 1 ⎠\ |
|
|
""" |
|
|
assert pretty(expr) in [ascii_str_1, ascii_str_2] |
|
|
assert upretty(expr) in [ucode_str_1, ucode_str_2] |
|
|
|
|
|
expr = f(x**x**x**x**x**x) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ / / / / x\\\\\\\\\\ |
|
|
| | | | \\x /|||| |
|
|
| | | \\x /||| |
|
|
| | \\x /|| |
|
|
| \\x /| |
|
|
f\\x /\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛ ⎛ ⎛ ⎛ ⎛ x⎞⎞⎞⎞⎞ |
|
|
⎜ ⎜ ⎜ ⎜ ⎝x ⎠⎟⎟⎟⎟ |
|
|
⎜ ⎜ ⎜ ⎝x ⎠⎟⎟⎟ |
|
|
⎜ ⎜ ⎝x ⎠⎟⎟ |
|
|
⎜ ⎝x ⎠⎟ |
|
|
f⎝x ⎠\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = sin(x)**2 |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
sin (x)\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
sin (x)\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = conjugate(a + b*I) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
_ _\n\ |
|
|
a - I*b\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
_ _\n\ |
|
|
a - ⅈ⋅b\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = conjugate(exp(a + b*I)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
_ _\n\ |
|
|
a - I*b\n\ |
|
|
e \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
_ _\n\ |
|
|
a - ⅈ⋅b\n\ |
|
|
ℯ \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = conjugate( f(1 + conjugate(f(x))) ) |
|
|
ascii_str_1 = \ |
|
|
"""\ |
|
|
___________\n\ |
|
|
/ ____\\\n\ |
|
|
f\\1 + f(x)/\ |
|
|
""" |
|
|
ascii_str_2 = \ |
|
|
"""\ |
|
|
___________\n\ |
|
|
/____ \\\n\ |
|
|
f\\f(x) + 1/\ |
|
|
""" |
|
|
ucode_str_1 = \ |
|
|
"""\ |
|
|
___________\n\ |
|
|
⎛ ____⎞\n\ |
|
|
f⎝1 + f(x)⎠\ |
|
|
""" |
|
|
ucode_str_2 = \ |
|
|
"""\ |
|
|
___________\n\ |
|
|
⎛____ ⎞\n\ |
|
|
f⎝f(x) + 1⎠\ |
|
|
""" |
|
|
assert pretty(expr) in [ascii_str_1, ascii_str_2] |
|
|
assert upretty(expr) in [ucode_str_1, ucode_str_2] |
|
|
|
|
|
expr = f(x/(y + 1), y) |
|
|
ascii_str_1 = \ |
|
|
"""\ |
|
|
/ x \\\n\ |
|
|
f|-----, y|\n\ |
|
|
\\1 + y /\ |
|
|
""" |
|
|
ascii_str_2 = \ |
|
|
"""\ |
|
|
/ x \\\n\ |
|
|
f|-----, y|\n\ |
|
|
\\y + 1 /\ |
|
|
""" |
|
|
ucode_str_1 = \ |
|
|
"""\ |
|
|
⎛ x ⎞\n\ |
|
|
f⎜─────, y⎟\n\ |
|
|
⎝1 + y ⎠\ |
|
|
""" |
|
|
ucode_str_2 = \ |
|
|
"""\ |
|
|
⎛ x ⎞\n\ |
|
|
f⎜─────, y⎟\n\ |
|
|
⎝y + 1 ⎠\ |
|
|
""" |
|
|
assert pretty(expr) in [ascii_str_1, ascii_str_2] |
|
|
assert upretty(expr) in [ucode_str_1, ucode_str_2] |
|
|
|
|
|
expr = floor(1 / (y - floor(x))) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ 1 \\\n\ |
|
|
floor|------------|\n\ |
|
|
\\y - floor(x)/\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎢ 1 ⎥\n\ |
|
|
⎢───────⎥\n\ |
|
|
⎣y - ⌊x⌋⎦\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = ceiling(1 / (y - ceiling(x))) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ 1 \\\n\ |
|
|
ceiling|--------------|\n\ |
|
|
\\y - ceiling(x)/\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎡ 1 ⎤\n\ |
|
|
⎢───────⎥\n\ |
|
|
⎢y - ⌈x⌉⎥\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = euler(n) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
E \n\ |
|
|
n\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
E \n\ |
|
|
n\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = euler(1/(1 + 1/(1 + 1/n))) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
E \n\ |
|
|
1 \n\ |
|
|
---------\n\ |
|
|
1 \n\ |
|
|
1 + -----\n\ |
|
|
1\n\ |
|
|
1 + -\n\ |
|
|
n\ |
|
|
""" |
|
|
|
|
|
ucode_str = \ |
|
|
"""\ |
|
|
E \n\ |
|
|
1 \n\ |
|
|
─────────\n\ |
|
|
1 \n\ |
|
|
1 + ─────\n\ |
|
|
1\n\ |
|
|
1 + ─\n\ |
|
|
n\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = euler(n, x) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
E (x)\n\ |
|
|
n \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
E (x)\n\ |
|
|
n \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = euler(n, x/2) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/x\\\n\ |
|
|
E |-|\n\ |
|
|
n\\2/\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛x⎞\n\ |
|
|
E ⎜─⎟\n\ |
|
|
n⎝2⎠\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_pretty_sqrt(): |
|
|
expr = sqrt(2) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
___\n\ |
|
|
\\/ 2 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"√2" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = 2**Rational(1, 3) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
3 ___\n\ |
|
|
\\/ 2 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
3 ___\n\ |
|
|
╲╱ 2 \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = 2**Rational(1, 1000) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
1000___\n\ |
|
|
\\/ 2 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
1000___\n\ |
|
|
╲╱ 2 \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = sqrt(x**2 + 1) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
________\n\ |
|
|
/ 2 \n\ |
|
|
\\/ x + 1 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
________\n\ |
|
|
╱ 2 \n\ |
|
|
╲╱ x + 1 \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = (1 + sqrt(5))**Rational(1, 3) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
___________\n\ |
|
|
3 / ___ \n\ |
|
|
\\/ 1 + \\/ 5 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
3 ________\n\ |
|
|
╲╱ 1 + √5 \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = 2**(1/x) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
x ___\n\ |
|
|
\\/ 2 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
x ___\n\ |
|
|
╲╱ 2 \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = sqrt(2 + pi) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
________\n\ |
|
|
\\/ 2 + pi \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
_______\n\ |
|
|
╲╱ 2 + π \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = (2 + ( |
|
|
1 + x**2)/(2 + x))**Rational(1, 4) + (1 + x**Rational(1, 1000))/sqrt(3 + x**2) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
____________ \n\ |
|
|
/ 2 1000___ \n\ |
|
|
/ x + 1 \\/ x + 1\n\ |
|
|
4 / 2 + ------ + -----------\n\ |
|
|
\\/ x + 2 ________\n\ |
|
|
/ 2 \n\ |
|
|
\\/ x + 3 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
____________ \n\ |
|
|
╱ 2 1000___ \n\ |
|
|
╱ x + 1 ╲╱ x + 1\n\ |
|
|
4 ╱ 2 + ────── + ───────────\n\ |
|
|
╲╱ x + 2 ________\n\ |
|
|
╱ 2 \n\ |
|
|
╲╱ x + 3 \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_pretty_sqrt_char_knob(): |
|
|
|
|
|
expr = sqrt(2) |
|
|
ucode_str1 = \ |
|
|
"""\ |
|
|
___\n\ |
|
|
╲╱ 2 \ |
|
|
""" |
|
|
ucode_str2 = \ |
|
|
"√2" |
|
|
assert xpretty(expr, use_unicode=True, |
|
|
use_unicode_sqrt_char=False) == ucode_str1 |
|
|
assert xpretty(expr, use_unicode=True, |
|
|
use_unicode_sqrt_char=True) == ucode_str2 |
|
|
|
|
|
|
|
|
def test_pretty_sqrt_longsymbol_no_sqrt_char(): |
|
|
|
|
|
expr = sqrt(Symbol('C1')) |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
____\n\ |
|
|
╲╱ C₁ \ |
|
|
""" |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_pretty_KroneckerDelta(): |
|
|
x, y = symbols("x, y") |
|
|
expr = KroneckerDelta(x, y) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
d \n\ |
|
|
x,y\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
δ \n\ |
|
|
x,y\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_pretty_product(): |
|
|
n, m, k, l = symbols('n m k l') |
|
|
f = symbols('f', cls=Function) |
|
|
expr = Product(f((n/3)**2), (n, k**2, l)) |
|
|
|
|
|
unicode_str = \ |
|
|
"""\ |
|
|
l \n\ |
|
|
─┬──────┬─ \n\ |
|
|
│ │ ⎛ 2⎞\n\ |
|
|
│ │ ⎜n ⎟\n\ |
|
|
│ │ f⎜──⎟\n\ |
|
|
│ │ ⎝9 ⎠\n\ |
|
|
│ │ \n\ |
|
|
2 \n\ |
|
|
n = k """ |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
l \n\ |
|
|
__________ \n\ |
|
|
| | / 2\\\n\ |
|
|
| | |n |\n\ |
|
|
| | f|--|\n\ |
|
|
| | \\9 /\n\ |
|
|
| | \n\ |
|
|
2 \n\ |
|
|
n = k """ |
|
|
|
|
|
expr = Product(f((n/3)**2), (n, k**2, l), (l, 1, m)) |
|
|
|
|
|
unicode_str = \ |
|
|
"""\ |
|
|
m l \n\ |
|
|
─┬──────┬─ ─┬──────┬─ \n\ |
|
|
│ │ │ │ ⎛ 2⎞\n\ |
|
|
│ │ │ │ ⎜n ⎟\n\ |
|
|
│ │ │ │ f⎜──⎟\n\ |
|
|
│ │ │ │ ⎝9 ⎠\n\ |
|
|
│ │ │ │ \n\ |
|
|
l = 1 2 \n\ |
|
|
n = k """ |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
m l \n\ |
|
|
__________ __________ \n\ |
|
|
| | | | / 2\\\n\ |
|
|
| | | | |n |\n\ |
|
|
| | | | f|--|\n\ |
|
|
| | | | \\9 /\n\ |
|
|
| | | | \n\ |
|
|
l = 1 2 \n\ |
|
|
n = k """ |
|
|
|
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == unicode_str |
|
|
|
|
|
|
|
|
def test_pretty_Lambda(): |
|
|
|
|
|
expr = Lambda(y, y) |
|
|
assert pretty(expr) == "x -> x" |
|
|
assert upretty(expr) == "x ↦ x" |
|
|
|
|
|
expr = Lambda(x, x+1) |
|
|
assert pretty(expr) == "x -> x + 1" |
|
|
assert upretty(expr) == "x ↦ x + 1" |
|
|
|
|
|
expr = Lambda(x, x**2) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2\n\ |
|
|
x -> x \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
2\n\ |
|
|
x ↦ x \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Lambda(x, x**2)**2 |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2 |
|
|
/ 2\\ \n\ |
|
|
\\x -> x / \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
2 |
|
|
⎛ 2⎞ \n\ |
|
|
⎝x ↦ x ⎠ \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Lambda((x, y), x) |
|
|
ascii_str = "(x, y) -> x" |
|
|
ucode_str = "(x, y) ↦ x" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Lambda((x, y), x**2) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2\n\ |
|
|
(x, y) -> x \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
2\n\ |
|
|
(x, y) ↦ x \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Lambda(((x, y),), x**2) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2\n\ |
|
|
((x, y),) -> x \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
2\n\ |
|
|
((x, y),) ↦ x \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_pretty_TransferFunction(): |
|
|
tf1 = TransferFunction(s - 1, s + 1, s) |
|
|
assert upretty(tf1) == "s - 1\n─────\ns + 1" |
|
|
tf2 = TransferFunction(2*s + 1, 3 - p, s) |
|
|
assert upretty(tf2) == "2⋅s + 1\n───────\n 3 - p " |
|
|
tf3 = TransferFunction(p, p + 1, p) |
|
|
assert upretty(tf3) == " p \n─────\np + 1" |
|
|
|
|
|
|
|
|
def test_pretty_Series(): |
|
|
tf1 = TransferFunction(x + y, x - 2*y, y) |
|
|
tf2 = TransferFunction(x - y, x + y, y) |
|
|
tf3 = TransferFunction(x**2 + y, y - x, y) |
|
|
tf4 = TransferFunction(2, 3, y) |
|
|
|
|
|
tfm1 = TransferFunctionMatrix([[tf1, tf2], [tf3, tf4]]) |
|
|
tfm2 = TransferFunctionMatrix([[tf3], [-tf4]]) |
|
|
tfm3 = TransferFunctionMatrix([[tf1, -tf2, -tf3], [tf3, -tf4, tf2]]) |
|
|
tfm4 = TransferFunctionMatrix([[tf1, tf2], [tf3, -tf4], [-tf2, -tf1]]) |
|
|
tfm5 = TransferFunctionMatrix([[-tf2, -tf1], [tf4, -tf3], [tf1, tf2]]) |
|
|
|
|
|
expected1 = \ |
|
|
"""\ |
|
|
⎛ 2 ⎞\n\ |
|
|
⎛ x + y ⎞ ⎜x + y⎟\n\ |
|
|
⎜───────⎟⋅⎜──────⎟\n\ |
|
|
⎝x - 2⋅y⎠ ⎝-x + y⎠\ |
|
|
""" |
|
|
expected2 = \ |
|
|
"""\ |
|
|
⎛-x + y⎞ ⎛-x - y ⎞\n\ |
|
|
⎜──────⎟⋅⎜───────⎟\n\ |
|
|
⎝x + y ⎠ ⎝x - 2⋅y⎠\ |
|
|
""" |
|
|
expected3 = \ |
|
|
"""\ |
|
|
⎛ 2 ⎞ \n\ |
|
|
⎜x + y⎟ ⎛ x + y ⎞ ⎛-x - y x - y⎞\n\ |
|
|
⎜──────⎟⋅⎜───────⎟⋅⎜─────── + ─────⎟\n\ |
|
|
⎝-x + y⎠ ⎝x - 2⋅y⎠ ⎝x - 2⋅y x + y⎠\ |
|
|
""" |
|
|
expected4 = \ |
|
|
"""\ |
|
|
⎛ 2 ⎞\n\ |
|
|
⎛ x + y x - y⎞ ⎜x - y x + y⎟\n\ |
|
|
⎜─────── + ─────⎟⋅⎜───── + ──────⎟\n\ |
|
|
⎝x - 2⋅y x + y⎠ ⎝x + y -x + y⎠\ |
|
|
""" |
|
|
expected5 = \ |
|
|
"""\ |
|
|
⎡ x + y x - y⎤ ⎡ 2 ⎤ \n\ |
|
|
⎢─────── ─────⎥ ⎢x + y⎥ \n\ |
|
|
⎢x - 2⋅y x + y⎥ ⎢──────⎥ \n\ |
|
|
⎢ ⎥ ⎢-x + y⎥ \n\ |
|
|
⎢ 2 ⎥ ⋅⎢ ⎥ \n\ |
|
|
⎢x + y 2 ⎥ ⎢ -2 ⎥ \n\ |
|
|
⎢────── ─ ⎥ ⎢ ─── ⎥ \n\ |
|
|
⎣-x + y 3 ⎦τ ⎣ 3 ⎦τ\ |
|
|
""" |
|
|
expected6 = \ |
|
|
"""\ |
|
|
⎛⎡ x + y x - y ⎤ ⎡ x - y x + y ⎤ ⎞\n\ |
|
|
⎜⎢─────── ───── ⎥ ⎢ ───── ───────⎥ ⎟\n\ |
|
|
⎡ x + y x - y⎤ ⎡ 2 ⎤ ⎜⎢x - 2⋅y x + y ⎥ ⎢ x + y x - 2⋅y⎥ ⎟\n\ |
|
|
⎢─────── ─────⎥ ⎢ x + y -x + y - x - y⎥ ⎜⎢ ⎥ ⎢ ⎥ ⎟\n\ |
|
|
⎢x - 2⋅y x + y⎥ ⎢─────── ────── ────────⎥ ⎜⎢ 2 ⎥ ⎢ 2 ⎥ ⎟\n\ |
|
|
⎢ ⎥ ⎢x - 2⋅y x + y -x + y ⎥ ⎜⎢x + y -2 ⎥ ⎢ -2 x + y ⎥ ⎟\n\ |
|
|
⎢ 2 ⎥ ⋅⎢ ⎥ ⋅⎜⎢────── ─── ⎥ + ⎢ ─── ────── ⎥ ⎟\n\ |
|
|
⎢x + y 2 ⎥ ⎢ 2 ⎥ ⎜⎢-x + y 3 ⎥ ⎢ 3 -x + y ⎥ ⎟\n\ |
|
|
⎢────── ─ ⎥ ⎢x + y -2 x - y ⎥ ⎜⎢ ⎥ ⎢ ⎥ ⎟\n\ |
|
|
⎣-x + y 3 ⎦τ ⎢────── ─── ───── ⎥ ⎜⎢-x + y -x - y ⎥ ⎢-x - y -x + y ⎥ ⎟\n\ |
|
|
⎣-x + y 3 x + y ⎦τ ⎜⎢────── ───────⎥ ⎢─────── ────── ⎥ ⎟\n\ |
|
|
⎝⎣x + y x - 2⋅y⎦τ ⎣x - 2⋅y x + y ⎦τ⎠\ |
|
|
""" |
|
|
|
|
|
assert upretty(Series(tf1, tf3)) == expected1 |
|
|
assert upretty(Series(-tf2, -tf1)) == expected2 |
|
|
assert upretty(Series(tf3, tf1, Parallel(-tf1, tf2))) == expected3 |
|
|
assert upretty(Series(Parallel(tf1, tf2), Parallel(tf2, tf3))) == expected4 |
|
|
assert upretty(MIMOSeries(tfm2, tfm1)) == expected5 |
|
|
assert upretty(MIMOSeries(MIMOParallel(tfm4, -tfm5), tfm3, tfm1)) == expected6 |
|
|
|
|
|
|
|
|
def test_pretty_Parallel(): |
|
|
tf1 = TransferFunction(x + y, x - 2*y, y) |
|
|
tf2 = TransferFunction(x - y, x + y, y) |
|
|
tf3 = TransferFunction(x**2 + y, y - x, y) |
|
|
tf4 = TransferFunction(y**2 - x, x**3 + x, y) |
|
|
|
|
|
tfm1 = TransferFunctionMatrix([[tf1, tf2], [tf3, -tf4], [-tf2, -tf1]]) |
|
|
tfm2 = TransferFunctionMatrix([[-tf2, -tf1], [tf4, -tf3], [tf1, tf2]]) |
|
|
tfm3 = TransferFunctionMatrix([[-tf1, tf2], [-tf3, tf4], [tf2, tf1]]) |
|
|
tfm4 = TransferFunctionMatrix([[-tf1, -tf2], [-tf3, -tf4]]) |
|
|
|
|
|
expected1 = \ |
|
|
"""\ |
|
|
x + y x - y\n\ |
|
|
─────── + ─────\n\ |
|
|
x - 2⋅y x + y\ |
|
|
""" |
|
|
expected2 = \ |
|
|
"""\ |
|
|
-x + y -x - y \n\ |
|
|
────── + ─────── |
|
|
x + y x - 2⋅y\ |
|
|
""" |
|
|
expected3 = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
x + y x + y ⎛-x - y ⎞ ⎛x - y⎞ |
|
|
────── + ─────── + ⎜───────⎟⋅⎜─────⎟ |
|
|
-x + y x - 2⋅y ⎝x - 2⋅y⎠ ⎝x + y⎠\ |
|
|
""" |
|
|
|
|
|
expected4 = \ |
|
|
"""\ |
|
|
⎛ 2 ⎞\n\ |
|
|
⎛ x + y ⎞ ⎛x - y⎞ ⎛x - y⎞ ⎜x + y⎟\n\ |
|
|
⎜───────⎟⋅⎜─────⎟ + ⎜─────⎟⋅⎜──────⎟\n\ |
|
|
⎝x - 2⋅y⎠ ⎝x + y⎠ ⎝x + y⎠ ⎝-x + y⎠\ |
|
|
""" |
|
|
expected5 = \ |
|
|
"""\ |
|
|
⎡ x + y -x + y ⎤ ⎡ x - y x + y ⎤ ⎡ x + y x - y ⎤ \n\ |
|
|
⎢─────── ────── ⎥ ⎢ ───── ───────⎥ ⎢─────── ───── ⎥ \n\ |
|
|
⎢x - 2⋅y x + y ⎥ ⎢ x + y x - 2⋅y⎥ ⎢x - 2⋅y x + y ⎥ \n\ |
|
|
⎢ ⎥ ⎢ ⎥ ⎢ ⎥ \n\ |
|
|
⎢ 2 2 ⎥ ⎢ 2 2 ⎥ ⎢ 2 2 ⎥ \n\ |
|
|
⎢x + y x - y ⎥ ⎢x - y x + y ⎥ ⎢x + y x - y ⎥ \n\ |
|
|
⎢────── ────── ⎥ + ⎢────── ────── ⎥ + ⎢────── ────── ⎥ \n\ |
|
|
⎢-x + y 3 ⎥ ⎢ 3 -x + y ⎥ ⎢-x + y 3 ⎥ \n\ |
|
|
⎢ x + x ⎥ ⎢x + x ⎥ ⎢ x + x ⎥ \n\ |
|
|
⎢ ⎥ ⎢ ⎥ ⎢ ⎥ \n\ |
|
|
⎢-x + y -x - y ⎥ ⎢-x - y -x + y ⎥ ⎢-x + y -x - y ⎥ \n\ |
|
|
⎢────── ───────⎥ ⎢─────── ────── ⎥ ⎢────── ───────⎥ \n\ |
|
|
⎣x + y x - 2⋅y⎦τ ⎣x - 2⋅y x + y ⎦τ ⎣x + y x - 2⋅y⎦τ\ |
|
|
""" |
|
|
expected6 = \ |
|
|
"""\ |
|
|
⎡ x - y x + y ⎤ ⎡-x + y -x - y ⎤ \n\ |
|
|
⎢ ───── ───────⎥ ⎢────── ─────── ⎥ \n\ |
|
|
⎢ x + y x - 2⋅y⎥ ⎡-x - y -x + y⎤ ⎢x + y x - 2⋅y ⎥ \n\ |
|
|
⎢ ⎥ ⎢─────── ──────⎥ ⎢ ⎥ \n\ |
|
|
⎢ 2 2 ⎥ ⎢x - 2⋅y x + y ⎥ ⎢ 2 2 ⎥ \n\ |
|
|
⎢x - y x + y ⎥ ⎢ ⎥ ⎢-x + y - x - y⎥ \n\ |
|
|
⎢────── ────── ⎥ ⋅⎢ 2 2⎥ + ⎢─────── ────────⎥ \n\ |
|
|
⎢ 3 -x + y ⎥ ⎢- x - y x - y ⎥ ⎢ 3 -x + y ⎥ \n\ |
|
|
⎢x + x ⎥ ⎢──────── ──────⎥ ⎢x + x ⎥ \n\ |
|
|
⎢ ⎥ ⎢ -x + y 3 ⎥ ⎢ ⎥ \n\ |
|
|
⎢-x - y -x + y ⎥ ⎣ x + x⎦τ ⎢ x + y x - y ⎥ \n\ |
|
|
⎢─────── ────── ⎥ ⎢─────── ───── ⎥ \n\ |
|
|
⎣x - 2⋅y x + y ⎦τ ⎣x - 2⋅y x + y ⎦τ\ |
|
|
""" |
|
|
assert upretty(Parallel(tf1, tf2)) == expected1 |
|
|
assert upretty(Parallel(-tf2, -tf1)) == expected2 |
|
|
assert upretty(Parallel(tf3, tf1, Series(-tf1, tf2))) == expected3 |
|
|
assert upretty(Parallel(Series(tf1, tf2), Series(tf2, tf3))) == expected4 |
|
|
assert upretty(MIMOParallel(-tfm3, -tfm2, tfm1)) == expected5 |
|
|
assert upretty(MIMOParallel(MIMOSeries(tfm4, -tfm2), tfm2)) == expected6 |
|
|
|
|
|
|
|
|
def test_pretty_Feedback(): |
|
|
tf = TransferFunction(1, 1, y) |
|
|
tf1 = TransferFunction(x + y, x - 2*y, y) |
|
|
tf2 = TransferFunction(x - y, x + y, y) |
|
|
tf3 = TransferFunction(y**2 - 2*y + 1, y + 5, y) |
|
|
tf4 = TransferFunction(x - 2*y**3, x + y, x) |
|
|
tf5 = TransferFunction(1 - x, x - y, y) |
|
|
tf6 = TransferFunction(2, 2, x) |
|
|
expected1 = \ |
|
|
"""\ |
|
|
⎛1⎞ \n\ |
|
|
⎜─⎟ \n\ |
|
|
⎝1⎠ \n\ |
|
|
─────────────\n\ |
|
|
1 ⎛ x + y ⎞\n\ |
|
|
─ + ⎜───────⎟\n\ |
|
|
1 ⎝x - 2⋅y⎠\ |
|
|
""" |
|
|
expected2 = \ |
|
|
"""\ |
|
|
⎛1⎞ \n\ |
|
|
⎜─⎟ \n\ |
|
|
⎝1⎠ \n\ |
|
|
────────────────────────────────────\n\ |
|
|
⎛ 2 ⎞\n\ |
|
|
1 ⎛x - y⎞ ⎛ x + y ⎞ ⎜y - 2⋅y + 1⎟\n\ |
|
|
─ + ⎜─────⎟⋅⎜───────⎟⋅⎜────────────⎟\n\ |
|
|
1 ⎝x + y⎠ ⎝x - 2⋅y⎠ ⎝ y + 5 ⎠\ |
|
|
""" |
|
|
expected3 = \ |
|
|
"""\ |
|
|
⎛ x + y ⎞ \n\ |
|
|
⎜───────⎟ \n\ |
|
|
⎝x - 2⋅y⎠ \n\ |
|
|
────────────────────────────────────────────\n\ |
|
|
⎛ 2 ⎞ \n\ |
|
|
1 ⎛ x + y ⎞ ⎛x - y⎞ ⎜y - 2⋅y + 1⎟ ⎛1 - x⎞\n\ |
|
|
─ + ⎜───────⎟⋅⎜─────⎟⋅⎜────────────⎟⋅⎜─────⎟\n\ |
|
|
1 ⎝x - 2⋅y⎠ ⎝x + y⎠ ⎝ y + 5 ⎠ ⎝x - y⎠\ |
|
|
""" |
|
|
expected4 = \ |
|
|
"""\ |
|
|
⎛ x + y ⎞ ⎛x - y⎞ \n\ |
|
|
⎜───────⎟⋅⎜─────⎟ \n\ |
|
|
⎝x - 2⋅y⎠ ⎝x + y⎠ \n\ |
|
|
─────────────────────\n\ |
|
|
1 ⎛ x + y ⎞ ⎛x - y⎞\n\ |
|
|
─ + ⎜───────⎟⋅⎜─────⎟\n\ |
|
|
1 ⎝x - 2⋅y⎠ ⎝x + y⎠\ |
|
|
""" |
|
|
expected5 = \ |
|
|
"""\ |
|
|
⎛ x + y ⎞ ⎛x - y⎞ \n\ |
|
|
⎜───────⎟⋅⎜─────⎟ \n\ |
|
|
⎝x - 2⋅y⎠ ⎝x + y⎠ \n\ |
|
|
─────────────────────────────\n\ |
|
|
1 ⎛ x + y ⎞ ⎛x - y⎞ ⎛1 - x⎞\n\ |
|
|
─ + ⎜───────⎟⋅⎜─────⎟⋅⎜─────⎟\n\ |
|
|
1 ⎝x - 2⋅y⎠ ⎝x + y⎠ ⎝x - y⎠\ |
|
|
""" |
|
|
expected6 = \ |
|
|
"""\ |
|
|
⎛ 2 ⎞ \n\ |
|
|
⎜y - 2⋅y + 1⎟ ⎛1 - x⎞ \n\ |
|
|
⎜────────────⎟⋅⎜─────⎟ \n\ |
|
|
⎝ y + 5 ⎠ ⎝x - y⎠ \n\ |
|
|
────────────────────────────────────────────\n\ |
|
|
⎛ 2 ⎞ \n\ |
|
|
1 ⎜y - 2⋅y + 1⎟ ⎛1 - x⎞ ⎛x - y⎞ ⎛ x + y ⎞\n\ |
|
|
─ + ⎜────────────⎟⋅⎜─────⎟⋅⎜─────⎟⋅⎜───────⎟\n\ |
|
|
1 ⎝ y + 5 ⎠ ⎝x - y⎠ ⎝x + y⎠ ⎝x - 2⋅y⎠\ |
|
|
""" |
|
|
expected7 = \ |
|
|
"""\ |
|
|
⎛ 3⎞ \n\ |
|
|
⎜x - 2⋅y ⎟ \n\ |
|
|
⎜────────⎟ \n\ |
|
|
⎝ x + y ⎠ \n\ |
|
|
──────────────────\n\ |
|
|
⎛ 3⎞ \n\ |
|
|
1 ⎜x - 2⋅y ⎟ ⎛2⎞\n\ |
|
|
─ + ⎜────────⎟⋅⎜─⎟\n\ |
|
|
1 ⎝ x + y ⎠ ⎝2⎠\ |
|
|
""" |
|
|
expected8 = \ |
|
|
"""\ |
|
|
⎛1 - x⎞ \n\ |
|
|
⎜─────⎟ \n\ |
|
|
⎝x - y⎠ \n\ |
|
|
───────────\n\ |
|
|
1 ⎛1 - x⎞\n\ |
|
|
─ + ⎜─────⎟\n\ |
|
|
1 ⎝x - y⎠\ |
|
|
""" |
|
|
expected9 = \ |
|
|
"""\ |
|
|
⎛ x + y ⎞ ⎛x - y⎞ \n\ |
|
|
⎜───────⎟⋅⎜─────⎟ \n\ |
|
|
⎝x - 2⋅y⎠ ⎝x + y⎠ \n\ |
|
|
─────────────────────────────\n\ |
|
|
1 ⎛ x + y ⎞ ⎛x - y⎞ ⎛1 - x⎞\n\ |
|
|
─ - ⎜───────⎟⋅⎜─────⎟⋅⎜─────⎟\n\ |
|
|
1 ⎝x - 2⋅y⎠ ⎝x + y⎠ ⎝x - y⎠\ |
|
|
""" |
|
|
expected10 = \ |
|
|
"""\ |
|
|
⎛1 - x⎞ \n\ |
|
|
⎜─────⎟ \n\ |
|
|
⎝x - y⎠ \n\ |
|
|
───────────\n\ |
|
|
1 ⎛1 - x⎞\n\ |
|
|
─ - ⎜─────⎟\n\ |
|
|
1 ⎝x - y⎠\ |
|
|
""" |
|
|
assert upretty(Feedback(tf, tf1)) == expected1 |
|
|
assert upretty(Feedback(tf, tf2*tf1*tf3)) == expected2 |
|
|
assert upretty(Feedback(tf1, tf2*tf3*tf5)) == expected3 |
|
|
assert upretty(Feedback(tf1*tf2, tf)) == expected4 |
|
|
assert upretty(Feedback(tf1*tf2, tf5)) == expected5 |
|
|
assert upretty(Feedback(tf3*tf5, tf2*tf1)) == expected6 |
|
|
assert upretty(Feedback(tf4, tf6)) == expected7 |
|
|
assert upretty(Feedback(tf5, tf)) == expected8 |
|
|
|
|
|
assert upretty(Feedback(tf1*tf2, tf5, 1)) == expected9 |
|
|
assert upretty(Feedback(tf5, tf, 1)) == expected10 |
|
|
|
|
|
|
|
|
def test_pretty_MIMOFeedback(): |
|
|
tf1 = TransferFunction(x + y, x - 2*y, y) |
|
|
tf2 = TransferFunction(x - y, x + y, y) |
|
|
tfm_1 = TransferFunctionMatrix([[tf1, tf2], [tf2, tf1]]) |
|
|
tfm_2 = TransferFunctionMatrix([[tf2, tf1], [tf1, tf2]]) |
|
|
tfm_3 = TransferFunctionMatrix([[tf1, tf1], [tf2, tf2]]) |
|
|
|
|
|
expected1 = \ |
|
|
"""\ |
|
|
⎛ ⎡ x + y x - y ⎤ ⎡ x - y x + y ⎤ ⎞-1 ⎡ x + y x - y ⎤ \n\ |
|
|
⎜ ⎢─────── ───── ⎥ ⎢ ───── ───────⎥ ⎟ ⎢─────── ───── ⎥ \n\ |
|
|
⎜ ⎢x - 2⋅y x + y ⎥ ⎢ x + y x - 2⋅y⎥ ⎟ ⎢x - 2⋅y x + y ⎥ \n\ |
|
|
⎜I - ⎢ ⎥ ⋅⎢ ⎥ ⎟ ⋅ ⎢ ⎥ \n\ |
|
|
⎜ ⎢ x - y x + y ⎥ ⎢ x + y x - y ⎥ ⎟ ⎢ x - y x + y ⎥ \n\ |
|
|
⎜ ⎢ ───── ───────⎥ ⎢─────── ───── ⎥ ⎟ ⎢ ───── ───────⎥ \n\ |
|
|
⎝ ⎣ x + y x - 2⋅y⎦τ ⎣x - 2⋅y x + y ⎦τ⎠ ⎣ x + y x - 2⋅y⎦τ\ |
|
|
""" |
|
|
expected2 = \ |
|
|
"""\ |
|
|
⎛ ⎡ x + y x - y ⎤ ⎡ x - y x + y ⎤ ⎡ x + y x + y ⎤ ⎞-1 ⎡ x + y x - y ⎤ ⎡ x - y x + y ⎤ \n\ |
|
|
⎜ ⎢─────── ───── ⎥ ⎢ ───── ───────⎥ ⎢─────── ───────⎥ ⎟ ⎢─────── ───── ⎥ ⎢ ───── ───────⎥ \n\ |
|
|
⎜ ⎢x - 2⋅y x + y ⎥ ⎢ x + y x - 2⋅y⎥ ⎢x - 2⋅y x - 2⋅y⎥ ⎟ ⎢x - 2⋅y x + y ⎥ ⎢ x + y x - 2⋅y⎥ \n\ |
|
|
⎜I + ⎢ ⎥ ⋅⎢ ⎥ ⋅⎢ ⎥ ⎟ ⋅ ⎢ ⎥ ⋅⎢ ⎥ \n\ |
|
|
⎜ ⎢ x - y x + y ⎥ ⎢ x + y x - y ⎥ ⎢ x - y x - y ⎥ ⎟ ⎢ x - y x + y ⎥ ⎢ x + y x - y ⎥ \n\ |
|
|
⎜ ⎢ ───── ───────⎥ ⎢─────── ───── ⎥ ⎢ ───── ───── ⎥ ⎟ ⎢ ───── ───────⎥ ⎢─────── ───── ⎥ \n\ |
|
|
⎝ ⎣ x + y x - 2⋅y⎦τ ⎣x - 2⋅y x + y ⎦τ ⎣ x + y x + y ⎦τ⎠ ⎣ x + y x - 2⋅y⎦τ ⎣x - 2⋅y x + y ⎦τ\ |
|
|
""" |
|
|
|
|
|
assert upretty(MIMOFeedback(tfm_1, tfm_2, 1)) == \ |
|
|
expected1 |
|
|
assert upretty(MIMOFeedback(tfm_1*tfm_2, tfm_3)) == \ |
|
|
expected2 |
|
|
|
|
|
|
|
|
def test_pretty_TransferFunctionMatrix(): |
|
|
tf1 = TransferFunction(x + y, x - 2*y, y) |
|
|
tf2 = TransferFunction(x - y, x + y, y) |
|
|
tf3 = TransferFunction(y**2 - 2*y + 1, y + 5, y) |
|
|
tf4 = TransferFunction(y, x**2 + x + 1, y) |
|
|
tf5 = TransferFunction(1 - x, x - y, y) |
|
|
tf6 = TransferFunction(2, 2, y) |
|
|
expected1 = \ |
|
|
"""\ |
|
|
⎡ x + y ⎤ \n\ |
|
|
⎢───────⎥ \n\ |
|
|
⎢x - 2⋅y⎥ \n\ |
|
|
⎢ ⎥ \n\ |
|
|
⎢ x - y ⎥ \n\ |
|
|
⎢ ───── ⎥ \n\ |
|
|
⎣ x + y ⎦τ\ |
|
|
""" |
|
|
expected2 = \ |
|
|
"""\ |
|
|
⎡ x + y ⎤ \n\ |
|
|
⎢ ─────── ⎥ \n\ |
|
|
⎢ x - 2⋅y ⎥ \n\ |
|
|
⎢ ⎥ \n\ |
|
|
⎢ x - y ⎥ \n\ |
|
|
⎢ ───── ⎥ \n\ |
|
|
⎢ x + y ⎥ \n\ |
|
|
⎢ ⎥ \n\ |
|
|
⎢ 2 ⎥ \n\ |
|
|
⎢- y + 2⋅y - 1⎥ \n\ |
|
|
⎢──────────────⎥ \n\ |
|
|
⎣ y + 5 ⎦τ\ |
|
|
""" |
|
|
expected3 = \ |
|
|
"""\ |
|
|
⎡ x + y x - y ⎤ \n\ |
|
|
⎢ ─────── ───── ⎥ \n\ |
|
|
⎢ x - 2⋅y x + y ⎥ \n\ |
|
|
⎢ ⎥ \n\ |
|
|
⎢ 2 ⎥ \n\ |
|
|
⎢y - 2⋅y + 1 y ⎥ \n\ |
|
|
⎢──────────── ──────────⎥ \n\ |
|
|
⎢ y + 5 2 ⎥ \n\ |
|
|
⎢ x + x + 1⎥ \n\ |
|
|
⎢ ⎥ \n\ |
|
|
⎢ 1 - x 2 ⎥ \n\ |
|
|
⎢ ───── ─ ⎥ \n\ |
|
|
⎣ x - y 2 ⎦τ\ |
|
|
""" |
|
|
expected4 = \ |
|
|
"""\ |
|
|
⎡ x - y x + y y ⎤ \n\ |
|
|
⎢ ───── ─────── ──────────⎥ \n\ |
|
|
⎢ x + y x - 2⋅y 2 ⎥ \n\ |
|
|
⎢ x + x + 1⎥ \n\ |
|
|
⎢ ⎥ \n\ |
|
|
⎢ 2 ⎥ \n\ |
|
|
⎢- y + 2⋅y - 1 x - 1 -2 ⎥ \n\ |
|
|
⎢────────────── ───── ─── ⎥ \n\ |
|
|
⎣ y + 5 x - y 2 ⎦τ\ |
|
|
""" |
|
|
expected5 = \ |
|
|
"""\ |
|
|
⎡ x + y x - y x + y y ⎤ \n\ |
|
|
⎢───────⋅───── ─────── ──────────⎥ \n\ |
|
|
⎢x - 2⋅y x + y x - 2⋅y 2 ⎥ \n\ |
|
|
⎢ x + x + 1⎥ \n\ |
|
|
⎢ ⎥ \n\ |
|
|
⎢ 1 - x 2 x + y -2 ⎥ \n\ |
|
|
⎢ ───── + ─ ─────── ─── ⎥ \n\ |
|
|
⎣ x - y 2 x - 2⋅y 2 ⎦τ\ |
|
|
""" |
|
|
|
|
|
assert upretty(TransferFunctionMatrix([[tf1], [tf2]])) == expected1 |
|
|
assert upretty(TransferFunctionMatrix([[tf1], [tf2], [-tf3]])) == expected2 |
|
|
assert upretty(TransferFunctionMatrix([[tf1, tf2], [tf3, tf4], [tf5, tf6]])) == expected3 |
|
|
assert upretty(TransferFunctionMatrix([[tf2, tf1, tf4], [-tf3, -tf5, -tf6]])) == expected4 |
|
|
assert upretty(TransferFunctionMatrix([[Series(tf2, tf1), tf1, tf4], [Parallel(tf6, tf5), tf1, -tf6]])) == \ |
|
|
expected5 |
|
|
|
|
|
|
|
|
def test_pretty_StateSpace(): |
|
|
ss1 = StateSpace(Matrix([a]), Matrix([b]), Matrix([c]), Matrix([d])) |
|
|
A = Matrix([[0, 1], [1, 0]]) |
|
|
B = Matrix([1, 0]) |
|
|
C = Matrix([[0, 1]]) |
|
|
D = Matrix([0]) |
|
|
ss2 = StateSpace(A, B, C, D) |
|
|
ss3 = StateSpace(Matrix([[-1.5, -2], [1, 0]]), |
|
|
Matrix([[0.5, 0], [0, 1]]), |
|
|
Matrix([[0, 1], [0, 2]]), |
|
|
Matrix([[2, 2], [1, 1]])) |
|
|
|
|
|
expected1 = \ |
|
|
"""\ |
|
|
⎡[a] [b]⎤\n\ |
|
|
⎢ ⎥\n\ |
|
|
⎣[c] [d]⎦\ |
|
|
""" |
|
|
expected2 = \ |
|
|
"""\ |
|
|
⎡⎡0 1⎤ ⎡1⎤⎤\n\ |
|
|
⎢⎢ ⎥ ⎢ ⎥⎥\n\ |
|
|
⎢⎣1 0⎦ ⎣0⎦⎥\n\ |
|
|
⎢ ⎥\n\ |
|
|
⎣[0 1] [0]⎦\ |
|
|
""" |
|
|
expected3 = \ |
|
|
"""\ |
|
|
⎡⎡-1.5 -2⎤ ⎡0.5 0⎤⎤\n\ |
|
|
⎢⎢ ⎥ ⎢ ⎥⎥\n\ |
|
|
⎢⎣ 1 0 ⎦ ⎣ 0 1⎦⎥\n\ |
|
|
⎢ ⎥\n\ |
|
|
⎢ ⎡0 1⎤ ⎡2 2⎤ ⎥\n\ |
|
|
⎢ ⎢ ⎥ ⎢ ⎥ ⎥\n\ |
|
|
⎣ ⎣0 2⎦ ⎣1 1⎦ ⎦\ |
|
|
""" |
|
|
|
|
|
assert upretty(ss1) == expected1 |
|
|
assert upretty(ss2) == expected2 |
|
|
assert upretty(ss3) == expected3 |
|
|
|
|
|
def test_pretty_order(): |
|
|
expr = O(1) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
O(1)\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
O(1)\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = O(1/x) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/1\\\n\ |
|
|
O|-|\n\ |
|
|
\\x/\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛1⎞\n\ |
|
|
O⎜─⎟\n\ |
|
|
⎝x⎠\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = O(x**2 + y**2) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ 2 2 \\\n\ |
|
|
O\\x + y ; (x, y) -> (0, 0)/\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛ 2 2 ⎞\n\ |
|
|
O⎝x + y ; (x, y) → (0, 0)⎠\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = O(1, (x, oo)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
O(1; x -> oo)\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
O(1; x → ∞)\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = O(1/x, (x, oo)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/1 \\\n\ |
|
|
O|-; x -> oo|\n\ |
|
|
\\x /\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛1 ⎞\n\ |
|
|
O⎜─; x → ∞⎟\n\ |
|
|
⎝x ⎠\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = O(x**2 + y**2, (x, oo), (y, oo)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ 2 2 \\\n\ |
|
|
O\\x + y ; (x, y) -> (oo, oo)/\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛ 2 2 ⎞\n\ |
|
|
O⎝x + y ; (x, y) → (∞, ∞)⎠\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_pretty_derivatives(): |
|
|
|
|
|
expr = Derivative(log(x), x, evaluate=False) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
d \n\ |
|
|
--(log(x))\n\ |
|
|
dx \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
d \n\ |
|
|
──(log(x))\n\ |
|
|
dx \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Derivative(log(x), x, evaluate=False) + x |
|
|
ascii_str_1 = \ |
|
|
"""\ |
|
|
d \n\ |
|
|
x + --(log(x))\n\ |
|
|
dx \ |
|
|
""" |
|
|
ascii_str_2 = \ |
|
|
"""\ |
|
|
d \n\ |
|
|
--(log(x)) + x\n\ |
|
|
dx \ |
|
|
""" |
|
|
ucode_str_1 = \ |
|
|
"""\ |
|
|
d \n\ |
|
|
x + ──(log(x))\n\ |
|
|
dx \ |
|
|
""" |
|
|
ucode_str_2 = \ |
|
|
"""\ |
|
|
d \n\ |
|
|
──(log(x)) + x\n\ |
|
|
dx \ |
|
|
""" |
|
|
assert pretty(expr) in [ascii_str_1, ascii_str_2] |
|
|
assert upretty(expr) in [ucode_str_1, ucode_str_2] |
|
|
|
|
|
|
|
|
expr = Derivative(log(x + y) + x, x) |
|
|
ascii_str_1 = \ |
|
|
"""\ |
|
|
d \n\ |
|
|
--(log(x + y) + x)\n\ |
|
|
dx \ |
|
|
""" |
|
|
ascii_str_2 = \ |
|
|
"""\ |
|
|
d \n\ |
|
|
--(x + log(x + y))\n\ |
|
|
dx \ |
|
|
""" |
|
|
ucode_str_1 = \ |
|
|
"""\ |
|
|
∂ \n\ |
|
|
──(log(x + y) + x)\n\ |
|
|
∂x \ |
|
|
""" |
|
|
ucode_str_2 = \ |
|
|
"""\ |
|
|
∂ \n\ |
|
|
──(x + log(x + y))\n\ |
|
|
∂x \ |
|
|
""" |
|
|
assert pretty(expr) in [ascii_str_1, ascii_str_2] |
|
|
assert upretty(expr) in [ucode_str_1, ucode_str_2], upretty(expr) |
|
|
|
|
|
|
|
|
expr = Derivative(log(x) + x**2, x, y) |
|
|
ascii_str_1 = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
d / 2\\\n\ |
|
|
-----\\log(x) + x /\n\ |
|
|
dy dx \ |
|
|
""" |
|
|
ascii_str_2 = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
d / 2 \\\n\ |
|
|
-----\\x + log(x)/\n\ |
|
|
dy dx \ |
|
|
""" |
|
|
ascii_str_3 = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
d / 2 \\\n\ |
|
|
-----\\x + log(x)/\n\ |
|
|
dy dx \ |
|
|
""" |
|
|
ucode_str_1 = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
d ⎛ 2⎞\n\ |
|
|
─────⎝log(x) + x ⎠\n\ |
|
|
dy dx \ |
|
|
""" |
|
|
ucode_str_2 = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
d ⎛ 2 ⎞\n\ |
|
|
─────⎝x + log(x)⎠\n\ |
|
|
dy dx \ |
|
|
""" |
|
|
ucode_str_3 = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
d ⎛ 2 ⎞\n\ |
|
|
─────⎝x + log(x)⎠\n\ |
|
|
dy dx \ |
|
|
""" |
|
|
assert pretty(expr) in [ascii_str_1, ascii_str_2, ascii_str_3] |
|
|
assert upretty(expr) in [ucode_str_1, ucode_str_2, ucode_str_3] |
|
|
|
|
|
expr = Derivative(2*x*y, y, x) + x**2 |
|
|
ascii_str_1 = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
d 2\n\ |
|
|
-----(2*x*y) + x \n\ |
|
|
dx dy \ |
|
|
""" |
|
|
ascii_str_2 = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
2 d \n\ |
|
|
x + -----(2*x*y)\n\ |
|
|
dx dy \ |
|
|
""" |
|
|
ascii_str_3 = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
2 d \n\ |
|
|
x + -----(2*x*y)\n\ |
|
|
dx dy \ |
|
|
""" |
|
|
ucode_str_1 = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
∂ 2\n\ |
|
|
─────(2⋅x⋅y) + x \n\ |
|
|
∂x ∂y \ |
|
|
""" |
|
|
ucode_str_2 = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
2 ∂ \n\ |
|
|
x + ─────(2⋅x⋅y)\n\ |
|
|
∂x ∂y \ |
|
|
""" |
|
|
ucode_str_3 = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
2 ∂ \n\ |
|
|
x + ─────(2⋅x⋅y)\n\ |
|
|
∂x ∂y \ |
|
|
""" |
|
|
assert pretty(expr) in [ascii_str_1, ascii_str_2, ascii_str_3] |
|
|
assert upretty(expr) in [ucode_str_1, ucode_str_2, ucode_str_3] |
|
|
|
|
|
expr = Derivative(2*x*y, x, x) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
d \n\ |
|
|
---(2*x*y)\n\ |
|
|
2 \n\ |
|
|
dx \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
∂ \n\ |
|
|
───(2⋅x⋅y)\n\ |
|
|
2 \n\ |
|
|
∂x \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Derivative(2*x*y, x, 17) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
17 \n\ |
|
|
d \n\ |
|
|
----(2*x*y)\n\ |
|
|
17 \n\ |
|
|
dx \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
17 \n\ |
|
|
∂ \n\ |
|
|
────(2⋅x⋅y)\n\ |
|
|
17 \n\ |
|
|
∂x \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Derivative(2*x*y, x, x, y) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
3 \n\ |
|
|
d \n\ |
|
|
------(2*x*y)\n\ |
|
|
2 \n\ |
|
|
dy dx \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
3 \n\ |
|
|
∂ \n\ |
|
|
──────(2⋅x⋅y)\n\ |
|
|
2 \n\ |
|
|
∂y ∂x \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
alpha = Symbol('alpha') |
|
|
beta = Function('beta') |
|
|
expr = beta(alpha).diff(alpha) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
d \n\ |
|
|
------(beta(alpha))\n\ |
|
|
dalpha \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
d \n\ |
|
|
──(β(α))\n\ |
|
|
dα \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Derivative(f(x), (x, n)) |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
n \n\ |
|
|
d \n\ |
|
|
---(f(x))\n\ |
|
|
n \n\ |
|
|
dx \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
n \n\ |
|
|
d \n\ |
|
|
───(f(x))\n\ |
|
|
n \n\ |
|
|
dx \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_pretty_integrals(): |
|
|
expr = Integral(log(x), x) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ \n\ |
|
|
| \n\ |
|
|
| log(x) dx\n\ |
|
|
| \n\ |
|
|
/ \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⌠ \n\ |
|
|
⎮ log(x) dx\n\ |
|
|
⌡ \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Integral(x**2, x) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ \n\ |
|
|
| \n\ |
|
|
| 2 \n\ |
|
|
| x dx\n\ |
|
|
| \n\ |
|
|
/ \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⌠ \n\ |
|
|
⎮ 2 \n\ |
|
|
⎮ x dx\n\ |
|
|
⌡ \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Integral((sin(x))**2 / (tan(x))**2) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ \n\ |
|
|
| \n\ |
|
|
| 2 \n\ |
|
|
| sin (x) \n\ |
|
|
| ------- dx\n\ |
|
|
| 2 \n\ |
|
|
| tan (x) \n\ |
|
|
| \n\ |
|
|
/ \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⌠ \n\ |
|
|
⎮ 2 \n\ |
|
|
⎮ sin (x) \n\ |
|
|
⎮ ─────── dx\n\ |
|
|
⎮ 2 \n\ |
|
|
⎮ tan (x) \n\ |
|
|
⌡ \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Integral(x**(2**x), x) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ \n\ |
|
|
| \n\ |
|
|
| / x\\ \n\ |
|
|
| \\2 / \n\ |
|
|
| x dx\n\ |
|
|
| \n\ |
|
|
/ \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⌠ \n\ |
|
|
⎮ ⎛ x⎞ \n\ |
|
|
⎮ ⎝2 ⎠ \n\ |
|
|
⎮ x dx\n\ |
|
|
⌡ \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Integral(x**2, (x, 1, 2)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
/ \n\ |
|
|
| \n\ |
|
|
| 2 \n\ |
|
|
| x dx\n\ |
|
|
| \n\ |
|
|
/ \n\ |
|
|
1 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
⌠ \n\ |
|
|
⎮ 2 \n\ |
|
|
⎮ x dx\n\ |
|
|
⌡ \n\ |
|
|
1 \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Integral(x**2, (x, Rational(1, 2), 10)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
10 \n\ |
|
|
/ \n\ |
|
|
| \n\ |
|
|
| 2 \n\ |
|
|
| x dx\n\ |
|
|
| \n\ |
|
|
/ \n\ |
|
|
1/2 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
10 \n\ |
|
|
⌠ \n\ |
|
|
⎮ 2 \n\ |
|
|
⎮ x dx\n\ |
|
|
⌡ \n\ |
|
|
1/2 \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Integral(x**2*y**2, x, y) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ / \n\ |
|
|
| | \n\ |
|
|
| | 2 2 \n\ |
|
|
| | x *y dx dy\n\ |
|
|
| | \n\ |
|
|
/ / \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⌠ ⌠ \n\ |
|
|
⎮ ⎮ 2 2 \n\ |
|
|
⎮ ⎮ x ⋅y dx dy\n\ |
|
|
⌡ ⌡ \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Integral(sin(th)/cos(ph), (th, 0, pi), (ph, 0, 2*pi)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2*pi pi \n\ |
|
|
/ / \n\ |
|
|
| | \n\ |
|
|
| | sin(theta) \n\ |
|
|
| | ---------- d(theta) d(phi)\n\ |
|
|
| | cos(phi) \n\ |
|
|
| | \n\ |
|
|
/ / \n\ |
|
|
0 0 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
2⋅π π \n\ |
|
|
⌠ ⌠ \n\ |
|
|
⎮ ⎮ sin(θ) \n\ |
|
|
⎮ ⎮ ────── dθ dφ\n\ |
|
|
⎮ ⎮ cos(φ) \n\ |
|
|
⌡ ⌡ \n\ |
|
|
0 0 \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_pretty_matrix(): |
|
|
|
|
|
expr = Matrix() |
|
|
ascii_str = "[]" |
|
|
unicode_str = "[]" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == unicode_str |
|
|
expr = Matrix(2, 0, lambda i, j: 0) |
|
|
ascii_str = "[]" |
|
|
unicode_str = "[]" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == unicode_str |
|
|
expr = Matrix(0, 2, lambda i, j: 0) |
|
|
ascii_str = "[]" |
|
|
unicode_str = "[]" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == unicode_str |
|
|
expr = Matrix([[x**2 + 1, 1], [y, x + y]]) |
|
|
ascii_str_1 = \ |
|
|
"""\ |
|
|
[ 2 ] |
|
|
[1 + x 1 ] |
|
|
[ ] |
|
|
[ y x + y]\ |
|
|
""" |
|
|
ascii_str_2 = \ |
|
|
"""\ |
|
|
[ 2 ] |
|
|
[x + 1 1 ] |
|
|
[ ] |
|
|
[ y x + y]\ |
|
|
""" |
|
|
ucode_str_1 = \ |
|
|
"""\ |
|
|
⎡ 2 ⎤ |
|
|
⎢1 + x 1 ⎥ |
|
|
⎢ ⎥ |
|
|
⎣ y x + y⎦\ |
|
|
""" |
|
|
ucode_str_2 = \ |
|
|
"""\ |
|
|
⎡ 2 ⎤ |
|
|
⎢x + 1 1 ⎥ |
|
|
⎢ ⎥ |
|
|
⎣ y x + y⎦\ |
|
|
""" |
|
|
assert pretty(expr) in [ascii_str_1, ascii_str_2] |
|
|
assert upretty(expr) in [ucode_str_1, ucode_str_2] |
|
|
|
|
|
expr = Matrix([[x/y, y, th], [0, exp(I*k*ph), 1]]) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
[x ] |
|
|
[- y theta] |
|
|
[y ] |
|
|
[ ] |
|
|
[ I*k*phi ] |
|
|
[0 e 1 ]\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎡x ⎤ |
|
|
⎢─ y θ⎥ |
|
|
⎢y ⎥ |
|
|
⎢ ⎥ |
|
|
⎢ ⅈ⋅k⋅φ ⎥ |
|
|
⎣0 ℯ 1⎦\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
unicode_str = \ |
|
|
"""\ |
|
|
⎡v̇_msc_00 0 0 ⎤ |
|
|
⎢ ⎥ |
|
|
⎢ 0 v̇_msc_01 0 ⎥ |
|
|
⎢ ⎥ |
|
|
⎣ 0 0 v̇_msc_02⎦\ |
|
|
""" |
|
|
|
|
|
expr = diag(*MatrixSymbol('vdot_msc',1,3)) |
|
|
assert upretty(expr) == unicode_str |
|
|
|
|
|
|
|
|
def test_pretty_ndim_arrays(): |
|
|
x, y, z, w = symbols("x y z w") |
|
|
|
|
|
for ArrayType in (ImmutableDenseNDimArray, ImmutableSparseNDimArray, MutableDenseNDimArray, MutableSparseNDimArray): |
|
|
|
|
|
M = ArrayType(x) |
|
|
|
|
|
assert pretty(M) == "x" |
|
|
assert upretty(M) == "x" |
|
|
|
|
|
M = ArrayType([[1/x, y], [z, w]]) |
|
|
M1 = ArrayType([1/x, y, z]) |
|
|
|
|
|
M2 = tensorproduct(M1, M) |
|
|
M3 = tensorproduct(M, M) |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
[1 ]\n\ |
|
|
[- y]\n\ |
|
|
[x ]\n\ |
|
|
[ ]\n\ |
|
|
[z w]\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎡1 ⎤\n\ |
|
|
⎢─ y⎥\n\ |
|
|
⎢x ⎥\n\ |
|
|
⎢ ⎥\n\ |
|
|
⎣z w⎦\ |
|
|
""" |
|
|
assert pretty(M) == ascii_str |
|
|
assert upretty(M) == ucode_str |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
[1 ]\n\ |
|
|
[- y z]\n\ |
|
|
[x ]\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎡1 ⎤\n\ |
|
|
⎢─ y z⎥\n\ |
|
|
⎣x ⎦\ |
|
|
""" |
|
|
assert pretty(M1) == ascii_str |
|
|
assert upretty(M1) == ucode_str |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
[[1 y] ]\n\ |
|
|
[[-- -] [z ]]\n\ |
|
|
[[ 2 x] [ y 2 ] [- y*z]]\n\ |
|
|
[[x ] [ - y ] [x ]]\n\ |
|
|
[[ ] [ x ] [ ]]\n\ |
|
|
[[z w] [ ] [ 2 ]]\n\ |
|
|
[[- -] [y*z w*y] [z w*z]]\n\ |
|
|
[[x x] ]\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎡⎡1 y⎤ ⎤\n\ |
|
|
⎢⎢── ─⎥ ⎡z ⎤⎥\n\ |
|
|
⎢⎢ 2 x⎥ ⎡ y 2 ⎤ ⎢─ y⋅z⎥⎥\n\ |
|
|
⎢⎢x ⎥ ⎢ ─ y ⎥ ⎢x ⎥⎥\n\ |
|
|
⎢⎢ ⎥ ⎢ x ⎥ ⎢ ⎥⎥\n\ |
|
|
⎢⎢z w⎥ ⎢ ⎥ ⎢ 2 ⎥⎥\n\ |
|
|
⎢⎢─ ─⎥ ⎣y⋅z w⋅y⎦ ⎣z w⋅z⎦⎥\n\ |
|
|
⎣⎣x x⎦ ⎦\ |
|
|
""" |
|
|
assert pretty(M2) == ascii_str |
|
|
assert upretty(M2) == ucode_str |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
[ [1 y] ]\n\ |
|
|
[ [-- -] ]\n\ |
|
|
[ [ 2 x] [ y 2 ]]\n\ |
|
|
[ [x ] [ - y ]]\n\ |
|
|
[ [ ] [ x ]]\n\ |
|
|
[ [z w] [ ]]\n\ |
|
|
[ [- -] [y*z w*y]]\n\ |
|
|
[ [x x] ]\n\ |
|
|
[ ]\n\ |
|
|
[[z ] [ w ]]\n\ |
|
|
[[- y*z] [ - w*y]]\n\ |
|
|
[[x ] [ x ]]\n\ |
|
|
[[ ] [ ]]\n\ |
|
|
[[ 2 ] [ 2 ]]\n\ |
|
|
[[z w*z] [w*z w ]]\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎡ ⎡1 y⎤ ⎤\n\ |
|
|
⎢ ⎢── ─⎥ ⎥\n\ |
|
|
⎢ ⎢ 2 x⎥ ⎡ y 2 ⎤⎥\n\ |
|
|
⎢ ⎢x ⎥ ⎢ ─ y ⎥⎥\n\ |
|
|
⎢ ⎢ ⎥ ⎢ x ⎥⎥\n\ |
|
|
⎢ ⎢z w⎥ ⎢ ⎥⎥\n\ |
|
|
⎢ ⎢─ ─⎥ ⎣y⋅z w⋅y⎦⎥\n\ |
|
|
⎢ ⎣x x⎦ ⎥\n\ |
|
|
⎢ ⎥\n\ |
|
|
⎢⎡z ⎤ ⎡ w ⎤⎥\n\ |
|
|
⎢⎢─ y⋅z⎥ ⎢ ─ w⋅y⎥⎥\n\ |
|
|
⎢⎢x ⎥ ⎢ x ⎥⎥\n\ |
|
|
⎢⎢ ⎥ ⎢ ⎥⎥\n\ |
|
|
⎢⎢ 2 ⎥ ⎢ 2 ⎥⎥\n\ |
|
|
⎣⎣z w⋅z⎦ ⎣w⋅z w ⎦⎦\ |
|
|
""" |
|
|
assert pretty(M3) == ascii_str |
|
|
assert upretty(M3) == ucode_str |
|
|
|
|
|
Mrow = ArrayType([[x, y, 1 / z]]) |
|
|
Mcolumn = ArrayType([[x], [y], [1 / z]]) |
|
|
Mcol2 = ArrayType([Mcolumn.tolist()]) |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
[[ 1]]\n\ |
|
|
[[x y -]]\n\ |
|
|
[[ z]]\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎡⎡ 1⎤⎤\n\ |
|
|
⎢⎢x y ─⎥⎥\n\ |
|
|
⎣⎣ z⎦⎦\ |
|
|
""" |
|
|
assert pretty(Mrow) == ascii_str |
|
|
assert upretty(Mrow) == ucode_str |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
[x]\n\ |
|
|
[ ]\n\ |
|
|
[y]\n\ |
|
|
[ ]\n\ |
|
|
[1]\n\ |
|
|
[-]\n\ |
|
|
[z]\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎡x⎤\n\ |
|
|
⎢ ⎥\n\ |
|
|
⎢y⎥\n\ |
|
|
⎢ ⎥\n\ |
|
|
⎢1⎥\n\ |
|
|
⎢─⎥\n\ |
|
|
⎣z⎦\ |
|
|
""" |
|
|
assert pretty(Mcolumn) == ascii_str |
|
|
assert upretty(Mcolumn) == ucode_str |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
[[x]]\n\ |
|
|
[[ ]]\n\ |
|
|
[[y]]\n\ |
|
|
[[ ]]\n\ |
|
|
[[1]]\n\ |
|
|
[[-]]\n\ |
|
|
[[z]]\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎡⎡x⎤⎤\n\ |
|
|
⎢⎢ ⎥⎥\n\ |
|
|
⎢⎢y⎥⎥\n\ |
|
|
⎢⎢ ⎥⎥\n\ |
|
|
⎢⎢1⎥⎥\n\ |
|
|
⎢⎢─⎥⎥\n\ |
|
|
⎣⎣z⎦⎦\ |
|
|
""" |
|
|
assert pretty(Mcol2) == ascii_str |
|
|
assert upretty(Mcol2) == ucode_str |
|
|
|
|
|
|
|
|
def test_tensor_TensorProduct(): |
|
|
A = MatrixSymbol("A", 3, 3) |
|
|
B = MatrixSymbol("B", 3, 3) |
|
|
assert upretty(TensorProduct(A, B)) == "A\u2297B" |
|
|
assert upretty(TensorProduct(A, B, A)) == "A\u2297B\u2297A" |
|
|
|
|
|
|
|
|
def test_diffgeom_print_WedgeProduct(): |
|
|
from sympy.diffgeom.rn import R2 |
|
|
from sympy.diffgeom import WedgeProduct |
|
|
wp = WedgeProduct(R2.dx, R2.dy) |
|
|
assert upretty(wp) == "ⅆ x∧ⅆ y" |
|
|
assert pretty(wp) == r"d x/\d y" |
|
|
|
|
|
|
|
|
def test_Adjoint(): |
|
|
X = MatrixSymbol('X', 2, 2) |
|
|
Y = MatrixSymbol('Y', 2, 2) |
|
|
assert pretty(Adjoint(X)) == " +\nX " |
|
|
assert pretty(Adjoint(X + Y)) == " +\n(X + Y) " |
|
|
assert pretty(Adjoint(X) + Adjoint(Y)) == " + +\nX + Y " |
|
|
assert pretty(Adjoint(X*Y)) == " +\n(X*Y) " |
|
|
assert pretty(Adjoint(Y)*Adjoint(X)) == " + +\nY *X " |
|
|
assert pretty(Adjoint(X**2)) == " +\n/ 2\\ \n\\X / " |
|
|
assert pretty(Adjoint(X)**2) == " 2\n/ +\\ \n\\X / " |
|
|
assert pretty(Adjoint(Inverse(X))) == " +\n/ -1\\ \n\\X / " |
|
|
assert pretty(Inverse(Adjoint(X))) == " -1\n/ +\\ \n\\X / " |
|
|
assert pretty(Adjoint(Transpose(X))) == " +\n/ T\\ \n\\X / " |
|
|
assert pretty(Transpose(Adjoint(X))) == " T\n/ +\\ \n\\X / " |
|
|
assert upretty(Adjoint(X)) == " †\nX " |
|
|
assert upretty(Adjoint(X + Y)) == " †\n(X + Y) " |
|
|
assert upretty(Adjoint(X) + Adjoint(Y)) == " † †\nX + Y " |
|
|
assert upretty(Adjoint(X*Y)) == " †\n(X⋅Y) " |
|
|
assert upretty(Adjoint(Y)*Adjoint(X)) == " † †\nY ⋅X " |
|
|
assert upretty(Adjoint(X**2)) == \ |
|
|
" †\n⎛ 2⎞ \n⎝X ⎠ " |
|
|
assert upretty(Adjoint(X)**2) == \ |
|
|
" 2\n⎛ †⎞ \n⎝X ⎠ " |
|
|
assert upretty(Adjoint(Inverse(X))) == \ |
|
|
" †\n⎛ -1⎞ \n⎝X ⎠ " |
|
|
assert upretty(Inverse(Adjoint(X))) == \ |
|
|
" -1\n⎛ †⎞ \n⎝X ⎠ " |
|
|
assert upretty(Adjoint(Transpose(X))) == \ |
|
|
" †\n⎛ T⎞ \n⎝X ⎠ " |
|
|
assert upretty(Transpose(Adjoint(X))) == \ |
|
|
" T\n⎛ †⎞ \n⎝X ⎠ " |
|
|
m = Matrix(((1, 2), (3, 4))) |
|
|
assert upretty(Adjoint(m)) == \ |
|
|
' †\n'\ |
|
|
'⎡1 2⎤ \n'\ |
|
|
'⎢ ⎥ \n'\ |
|
|
'⎣3 4⎦ ' |
|
|
assert upretty(Adjoint(m+X)) == \ |
|
|
' †\n'\ |
|
|
'⎛⎡1 2⎤ ⎞ \n'\ |
|
|
'⎜⎢ ⎥ + X⎟ \n'\ |
|
|
'⎝⎣3 4⎦ ⎠ ' |
|
|
assert upretty(Adjoint(BlockMatrix(((OneMatrix(2, 2), X), |
|
|
(m, ZeroMatrix(2, 2)))))) == \ |
|
|
' †\n'\ |
|
|
'⎡ 𝟙 X⎤ \n'\ |
|
|
'⎢ ⎥ \n'\ |
|
|
'⎢⎡1 2⎤ ⎥ \n'\ |
|
|
'⎢⎢ ⎥ 𝟘⎥ \n'\ |
|
|
'⎣⎣3 4⎦ ⎦ ' |
|
|
|
|
|
|
|
|
def test_Transpose(): |
|
|
X = MatrixSymbol('X', 2, 2) |
|
|
Y = MatrixSymbol('Y', 2, 2) |
|
|
assert pretty(Transpose(X)) == " T\nX " |
|
|
assert pretty(Transpose(X + Y)) == " T\n(X + Y) " |
|
|
assert pretty(Transpose(X) + Transpose(Y)) == " T T\nX + Y " |
|
|
assert pretty(Transpose(X*Y)) == " T\n(X*Y) " |
|
|
assert pretty(Transpose(Y)*Transpose(X)) == " T T\nY *X " |
|
|
assert pretty(Transpose(X**2)) == " T\n/ 2\\ \n\\X / " |
|
|
assert pretty(Transpose(X)**2) == " 2\n/ T\\ \n\\X / " |
|
|
assert pretty(Transpose(Inverse(X))) == " T\n/ -1\\ \n\\X / " |
|
|
assert pretty(Inverse(Transpose(X))) == " -1\n/ T\\ \n\\X / " |
|
|
assert upretty(Transpose(X)) == " T\nX " |
|
|
assert upretty(Transpose(X + Y)) == " T\n(X + Y) " |
|
|
assert upretty(Transpose(X) + Transpose(Y)) == " T T\nX + Y " |
|
|
assert upretty(Transpose(X*Y)) == " T\n(X⋅Y) " |
|
|
assert upretty(Transpose(Y)*Transpose(X)) == " T T\nY ⋅X " |
|
|
assert upretty(Transpose(X**2)) == \ |
|
|
" T\n⎛ 2⎞ \n⎝X ⎠ " |
|
|
assert upretty(Transpose(X)**2) == \ |
|
|
" 2\n⎛ T⎞ \n⎝X ⎠ " |
|
|
assert upretty(Transpose(Inverse(X))) == \ |
|
|
" T\n⎛ -1⎞ \n⎝X ⎠ " |
|
|
assert upretty(Inverse(Transpose(X))) == \ |
|
|
" -1\n⎛ T⎞ \n⎝X ⎠ " |
|
|
m = Matrix(((1, 2), (3, 4))) |
|
|
assert upretty(Transpose(m)) == \ |
|
|
' T\n'\ |
|
|
'⎡1 2⎤ \n'\ |
|
|
'⎢ ⎥ \n'\ |
|
|
'⎣3 4⎦ ' |
|
|
assert upretty(Transpose(m+X)) == \ |
|
|
' T\n'\ |
|
|
'⎛⎡1 2⎤ ⎞ \n'\ |
|
|
'⎜⎢ ⎥ + X⎟ \n'\ |
|
|
'⎝⎣3 4⎦ ⎠ ' |
|
|
assert upretty(Transpose(BlockMatrix(((OneMatrix(2, 2), X), |
|
|
(m, ZeroMatrix(2, 2)))))) == \ |
|
|
' T\n'\ |
|
|
'⎡ 𝟙 X⎤ \n'\ |
|
|
'⎢ ⎥ \n'\ |
|
|
'⎢⎡1 2⎤ ⎥ \n'\ |
|
|
'⎢⎢ ⎥ 𝟘⎥ \n'\ |
|
|
'⎣⎣3 4⎦ ⎦ ' |
|
|
|
|
|
|
|
|
def test_pretty_Trace_issue_9044(): |
|
|
X = Matrix([[1, 2], [3, 4]]) |
|
|
Y = Matrix([[2, 4], [6, 8]]) |
|
|
ascii_str_1 = \ |
|
|
"""\ |
|
|
/[1 2]\\ |
|
|
tr|[ ]| |
|
|
\\[3 4]/\ |
|
|
""" |
|
|
ucode_str_1 = \ |
|
|
"""\ |
|
|
⎛⎡1 2⎤⎞ |
|
|
tr⎜⎢ ⎥⎟ |
|
|
⎝⎣3 4⎦⎠\ |
|
|
""" |
|
|
ascii_str_2 = \ |
|
|
"""\ |
|
|
/[1 2]\\ /[2 4]\\ |
|
|
tr|[ ]| + tr|[ ]| |
|
|
\\[3 4]/ \\[6 8]/\ |
|
|
""" |
|
|
ucode_str_2 = \ |
|
|
"""\ |
|
|
⎛⎡1 2⎤⎞ ⎛⎡2 4⎤⎞ |
|
|
tr⎜⎢ ⎥⎟ + tr⎜⎢ ⎥⎟ |
|
|
⎝⎣3 4⎦⎠ ⎝⎣6 8⎦⎠\ |
|
|
""" |
|
|
assert pretty(Trace(X)) == ascii_str_1 |
|
|
assert upretty(Trace(X)) == ucode_str_1 |
|
|
|
|
|
assert pretty(Trace(X) + Trace(Y)) == ascii_str_2 |
|
|
assert upretty(Trace(X) + Trace(Y)) == ucode_str_2 |
|
|
|
|
|
|
|
|
def test_MatrixSlice(): |
|
|
n = Symbol('n', integer=True) |
|
|
x, y, z, w, t, = symbols('x y z w t') |
|
|
X = MatrixSymbol('X', n, n) |
|
|
Y = MatrixSymbol('Y', 10, 10) |
|
|
Z = MatrixSymbol('Z', 10, 10) |
|
|
|
|
|
expr = MatrixSlice(X, (None, None, None), (None, None, None)) |
|
|
assert pretty(expr) == upretty(expr) == 'X[:, :]' |
|
|
expr = X[x:x + 1, y:y + 1] |
|
|
assert pretty(expr) == upretty(expr) == 'X[x:x + 1, y:y + 1]' |
|
|
expr = X[x:x + 1:2, y:y + 1:2] |
|
|
assert pretty(expr) == upretty(expr) == 'X[x:x + 1:2, y:y + 1:2]' |
|
|
expr = X[:x, y:] |
|
|
assert pretty(expr) == upretty(expr) == 'X[:x, y:]' |
|
|
expr = X[:x, y:] |
|
|
assert pretty(expr) == upretty(expr) == 'X[:x, y:]' |
|
|
expr = X[x:, :y] |
|
|
assert pretty(expr) == upretty(expr) == 'X[x:, :y]' |
|
|
expr = X[x:y, z:w] |
|
|
assert pretty(expr) == upretty(expr) == 'X[x:y, z:w]' |
|
|
expr = X[x:y:t, w:t:x] |
|
|
assert pretty(expr) == upretty(expr) == 'X[x:y:t, w:t:x]' |
|
|
expr = X[x::y, t::w] |
|
|
assert pretty(expr) == upretty(expr) == 'X[x::y, t::w]' |
|
|
expr = X[:x:y, :t:w] |
|
|
assert pretty(expr) == upretty(expr) == 'X[:x:y, :t:w]' |
|
|
expr = X[::x, ::y] |
|
|
assert pretty(expr) == upretty(expr) == 'X[::x, ::y]' |
|
|
expr = MatrixSlice(X, (0, None, None), (0, None, None)) |
|
|
assert pretty(expr) == upretty(expr) == 'X[:, :]' |
|
|
expr = MatrixSlice(X, (None, n, None), (None, n, None)) |
|
|
assert pretty(expr) == upretty(expr) == 'X[:, :]' |
|
|
expr = MatrixSlice(X, (0, n, None), (0, n, None)) |
|
|
assert pretty(expr) == upretty(expr) == 'X[:, :]' |
|
|
expr = MatrixSlice(X, (0, n, 2), (0, n, 2)) |
|
|
assert pretty(expr) == upretty(expr) == 'X[::2, ::2]' |
|
|
expr = X[1:2:3, 4:5:6] |
|
|
assert pretty(expr) == upretty(expr) == 'X[1:2:3, 4:5:6]' |
|
|
expr = X[1:3:5, 4:6:8] |
|
|
assert pretty(expr) == upretty(expr) == 'X[1:3:5, 4:6:8]' |
|
|
expr = X[1:10:2] |
|
|
assert pretty(expr) == upretty(expr) == 'X[1:10:2, :]' |
|
|
expr = Y[:5, 1:9:2] |
|
|
assert pretty(expr) == upretty(expr) == 'Y[:5, 1:9:2]' |
|
|
expr = Y[:5, 1:10:2] |
|
|
assert pretty(expr) == upretty(expr) == 'Y[:5, 1::2]' |
|
|
expr = Y[5, :5:2] |
|
|
assert pretty(expr) == upretty(expr) == 'Y[5:6, :5:2]' |
|
|
expr = X[0:1, 0:1] |
|
|
assert pretty(expr) == upretty(expr) == 'X[:1, :1]' |
|
|
expr = X[0:1:2, 0:1:2] |
|
|
assert pretty(expr) == upretty(expr) == 'X[:1:2, :1:2]' |
|
|
expr = (Y + Z)[2:, 2:] |
|
|
assert pretty(expr) == upretty(expr) == '(Y + Z)[2:, 2:]' |
|
|
|
|
|
|
|
|
def test_MatrixExpressions(): |
|
|
n = Symbol('n', integer=True) |
|
|
X = MatrixSymbol('X', n, n) |
|
|
|
|
|
assert pretty(X) == upretty(X) == "X" |
|
|
|
|
|
|
|
|
|
|
|
expr = (X.T*X).applyfunc(sin) |
|
|
|
|
|
ascii_str = """\ |
|
|
/ T \\\n\ |
|
|
(d -> sin(d)).\\X *X/\ |
|
|
""" |
|
|
ucode_str = """\ |
|
|
⎛ T ⎞\n\ |
|
|
(d ↦ sin(d))˳⎝X ⋅X⎠\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
lamda = Lambda(x, 1/x) |
|
|
expr = (n*X).applyfunc(lamda) |
|
|
ascii_str = """\ |
|
|
/ 1\\ \n\ |
|
|
|x -> -|.(n*X)\n\ |
|
|
\\ x/ \ |
|
|
""" |
|
|
ucode_str = """\ |
|
|
⎛ 1⎞ \n\ |
|
|
⎜x ↦ ─⎟˳(n⋅X)\n\ |
|
|
⎝ x⎠ \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_pretty_dotproduct(): |
|
|
from sympy.matrices.expressions.dotproduct import DotProduct |
|
|
n = symbols("n", integer=True) |
|
|
A = MatrixSymbol('A', n, 1) |
|
|
B = MatrixSymbol('B', n, 1) |
|
|
C = Matrix(1, 3, [1, 2, 3]) |
|
|
D = Matrix(1, 3, [1, 3, 4]) |
|
|
|
|
|
assert pretty(DotProduct(A, B)) == "A*B" |
|
|
assert pretty(DotProduct(C, D)) == "[1 2 3]*[1 3 4]" |
|
|
assert upretty(DotProduct(A, B)) == "A⋅B" |
|
|
assert upretty(DotProduct(C, D)) == "[1 2 3]⋅[1 3 4]" |
|
|
|
|
|
|
|
|
def test_pretty_Determinant(): |
|
|
from sympy.matrices import Determinant, Inverse, BlockMatrix, OneMatrix, ZeroMatrix |
|
|
m = Matrix(((1, 2), (3, 4))) |
|
|
assert upretty(Determinant(m)) == '│1 2│\n│ │\n│3 4│' |
|
|
assert upretty(Determinant(Inverse(m))) == \ |
|
|
'│ -1│\n'\ |
|
|
'│⎡1 2⎤ │\n'\ |
|
|
'│⎢ ⎥ │\n'\ |
|
|
'│⎣3 4⎦ │' |
|
|
X = MatrixSymbol('X', 2, 2) |
|
|
assert upretty(Determinant(X)) == '│X│' |
|
|
assert upretty(Determinant(X + m)) == \ |
|
|
'│⎡1 2⎤ │\n'\ |
|
|
'│⎢ ⎥ + X│\n'\ |
|
|
'│⎣3 4⎦ │' |
|
|
assert upretty(Determinant(BlockMatrix(((OneMatrix(2, 2), X), |
|
|
(m, ZeroMatrix(2, 2)))))) == \ |
|
|
'│ 𝟙 X│\n'\ |
|
|
'│ │\n'\ |
|
|
'│⎡1 2⎤ │\n'\ |
|
|
'│⎢ ⎥ 𝟘│\n'\ |
|
|
'│⎣3 4⎦ │' |
|
|
|
|
|
|
|
|
def test_pretty_piecewise(): |
|
|
expr = Piecewise((x, x < 1), (x**2, True)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/x for x < 1\n\ |
|
|
| \n\ |
|
|
< 2 \n\ |
|
|
|x otherwise\n\ |
|
|
\\ \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎧x for x < 1\n\ |
|
|
⎪ \n\ |
|
|
⎨ 2 \n\ |
|
|
⎪x otherwise\n\ |
|
|
⎩ \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = -Piecewise((x, x < 1), (x**2, True)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
//x for x < 1\\\n\ |
|
|
|| |\n\ |
|
|
-|< 2 |\n\ |
|
|
||x otherwise|\n\ |
|
|
\\\\ /\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛⎧x for x < 1⎞\n\ |
|
|
⎜⎪ ⎟\n\ |
|
|
-⎜⎨ 2 ⎟\n\ |
|
|
⎜⎪x otherwise⎟\n\ |
|
|
⎝⎩ ⎠\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = x + Piecewise((x, x > 0), (y, True)) + Piecewise((x/y, x < 2), |
|
|
(y**2, x > 2), (1, True)) + 1 |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
//x \\ \n\ |
|
|
||- for x < 2| \n\ |
|
|
||y | \n\ |
|
|
//x for x > 0\\ || | \n\ |
|
|
x + |< | + |< 2 | + 1\n\ |
|
|
\\\\y otherwise/ ||y for x > 2| \n\ |
|
|
|| | \n\ |
|
|
||1 otherwise| \n\ |
|
|
\\\\ / \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛⎧x ⎞ \n\ |
|
|
⎜⎪─ for x < 2⎟ \n\ |
|
|
⎜⎪y ⎟ \n\ |
|
|
⎛⎧x for x > 0⎞ ⎜⎪ ⎟ \n\ |
|
|
x + ⎜⎨ ⎟ + ⎜⎨ 2 ⎟ + 1\n\ |
|
|
⎝⎩y otherwise⎠ ⎜⎪y for x > 2⎟ \n\ |
|
|
⎜⎪ ⎟ \n\ |
|
|
⎜⎪1 otherwise⎟ \n\ |
|
|
⎝⎩ ⎠ \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = x - Piecewise((x, x > 0), (y, True)) + Piecewise((x/y, x < 2), |
|
|
(y**2, x > 2), (1, True)) + 1 |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
//x \\ \n\ |
|
|
||- for x < 2| \n\ |
|
|
||y | \n\ |
|
|
//x for x > 0\\ || | \n\ |
|
|
x - |< | + |< 2 | + 1\n\ |
|
|
\\\\y otherwise/ ||y for x > 2| \n\ |
|
|
|| | \n\ |
|
|
||1 otherwise| \n\ |
|
|
\\\\ / \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛⎧x ⎞ \n\ |
|
|
⎜⎪─ for x < 2⎟ \n\ |
|
|
⎜⎪y ⎟ \n\ |
|
|
⎛⎧x for x > 0⎞ ⎜⎪ ⎟ \n\ |
|
|
x - ⎜⎨ ⎟ + ⎜⎨ 2 ⎟ + 1\n\ |
|
|
⎝⎩y otherwise⎠ ⎜⎪y for x > 2⎟ \n\ |
|
|
⎜⎪ ⎟ \n\ |
|
|
⎜⎪1 otherwise⎟ \n\ |
|
|
⎝⎩ ⎠ \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = x*Piecewise((x, x > 0), (y, True)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
//x for x > 0\\\n\ |
|
|
x*|< |\n\ |
|
|
\\\\y otherwise/\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛⎧x for x > 0⎞\n\ |
|
|
x⋅⎜⎨ ⎟\n\ |
|
|
⎝⎩y otherwise⎠\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Piecewise((x, x > 0), (y, True))*Piecewise((x/y, x < 2), (y**2, x > |
|
|
2), (1, True)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
//x \\\n\ |
|
|
||- for x < 2|\n\ |
|
|
||y |\n\ |
|
|
//x for x > 0\\ || |\n\ |
|
|
|< |*|< 2 |\n\ |
|
|
\\\\y otherwise/ ||y for x > 2|\n\ |
|
|
|| |\n\ |
|
|
||1 otherwise|\n\ |
|
|
\\\\ /\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛⎧x ⎞\n\ |
|
|
⎜⎪─ for x < 2⎟\n\ |
|
|
⎜⎪y ⎟\n\ |
|
|
⎛⎧x for x > 0⎞ ⎜⎪ ⎟\n\ |
|
|
⎜⎨ ⎟⋅⎜⎨ 2 ⎟\n\ |
|
|
⎝⎩y otherwise⎠ ⎜⎪y for x > 2⎟\n\ |
|
|
⎜⎪ ⎟\n\ |
|
|
⎜⎪1 otherwise⎟\n\ |
|
|
⎝⎩ ⎠\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = -Piecewise((x, x > 0), (y, True))*Piecewise((x/y, x < 2), (y**2, x |
|
|
> 2), (1, True)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
//x \\\n\ |
|
|
||- for x < 2|\n\ |
|
|
||y |\n\ |
|
|
//x for x > 0\\ || |\n\ |
|
|
-|< |*|< 2 |\n\ |
|
|
\\\\y otherwise/ ||y for x > 2|\n\ |
|
|
|| |\n\ |
|
|
||1 otherwise|\n\ |
|
|
\\\\ /\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛⎧x ⎞\n\ |
|
|
⎜⎪─ for x < 2⎟\n\ |
|
|
⎜⎪y ⎟\n\ |
|
|
⎛⎧x for x > 0⎞ ⎜⎪ ⎟\n\ |
|
|
-⎜⎨ ⎟⋅⎜⎨ 2 ⎟\n\ |
|
|
⎝⎩y otherwise⎠ ⎜⎪y for x > 2⎟\n\ |
|
|
⎜⎪ ⎟\n\ |
|
|
⎜⎪1 otherwise⎟\n\ |
|
|
⎝⎩ ⎠\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Piecewise((0, Abs(1/y) < 1), (1, Abs(y) < 1), (y*meijerg(((2, 1), |
|
|
()), ((), (1, 0)), 1/y), True)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ 1 \n\ |
|
|
| 0 for --- < 1\n\ |
|
|
| |y| \n\ |
|
|
| \n\ |
|
|
< 1 for |y| < 1\n\ |
|
|
| \n\ |
|
|
| __0, 2 /1, 2 | 1\\ \n\ |
|
|
|y*/__ | | -| otherwise \n\ |
|
|
\\ \\_|2, 2 \\ 0, 1 | y/ \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎧ 1 \n\ |
|
|
⎪ 0 for ─── < 1\n\ |
|
|
⎪ │y│ \n\ |
|
|
⎪ \n\ |
|
|
⎨ 1 for │y│ < 1\n\ |
|
|
⎪ \n\ |
|
|
⎪ ╭─╮0, 2 ⎛1, 2 │ 1⎞ \n\ |
|
|
⎪y⋅│╶┐ ⎜ │ ─⎟ otherwise \n\ |
|
|
⎩ ╰─╯2, 2 ⎝ 0, 1 │ y⎠ \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
|
|
|
expr = Pow(Piecewise((x, x > 0), (y, True)), 2, evaluate=False) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2\n\ |
|
|
//x for x > 0\\ \n\ |
|
|
|< | \n\ |
|
|
\\\\y otherwise/ \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
2\n\ |
|
|
⎛⎧x for x > 0⎞ \n\ |
|
|
⎜⎨ ⎟ \n\ |
|
|
⎝⎩y otherwise⎠ \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_pretty_ITE(): |
|
|
expr = ITE(x, y, z) |
|
|
assert pretty(expr) == ( |
|
|
'/y for x \n' |
|
|
'< \n' |
|
|
'\\z otherwise' |
|
|
) |
|
|
assert upretty(expr) == """\ |
|
|
⎧y for x \n\ |
|
|
⎨ \n\ |
|
|
⎩z otherwise\ |
|
|
""" |
|
|
|
|
|
|
|
|
def test_pretty_seq(): |
|
|
expr = () |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
()\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
()\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = [] |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
[]\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
[]\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = {} |
|
|
expr_2 = {} |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
{}\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
{}\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert pretty(expr_2) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
assert upretty(expr_2) == ucode_str |
|
|
|
|
|
expr = (1/x,) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
1 \n\ |
|
|
(-,)\n\ |
|
|
x \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛1 ⎞\n\ |
|
|
⎜─,⎟\n\ |
|
|
⎝x ⎠\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = [x**2, 1/x, x, y, sin(th)**2/cos(ph)**2] |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
2 1 sin (theta) \n\ |
|
|
[x , -, x, y, -----------]\n\ |
|
|
x 2 \n\ |
|
|
cos (phi) \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎡ 2 ⎤\n\ |
|
|
⎢ 2 1 sin (θ)⎥\n\ |
|
|
⎢x , ─, x, y, ───────⎥\n\ |
|
|
⎢ x 2 ⎥\n\ |
|
|
⎣ cos (φ)⎦\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = (x**2, 1/x, x, y, sin(th)**2/cos(ph)**2) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
2 1 sin (theta) \n\ |
|
|
(x , -, x, y, -----------)\n\ |
|
|
x 2 \n\ |
|
|
cos (phi) \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛ 2 ⎞\n\ |
|
|
⎜ 2 1 sin (θ)⎟\n\ |
|
|
⎜x , ─, x, y, ───────⎟\n\ |
|
|
⎜ x 2 ⎟\n\ |
|
|
⎝ cos (φ)⎠\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Tuple(x**2, 1/x, x, y, sin(th)**2/cos(ph)**2) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
2 1 sin (theta) \n\ |
|
|
(x , -, x, y, -----------)\n\ |
|
|
x 2 \n\ |
|
|
cos (phi) \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛ 2 ⎞\n\ |
|
|
⎜ 2 1 sin (θ)⎟\n\ |
|
|
⎜x , ─, x, y, ───────⎟\n\ |
|
|
⎜ x 2 ⎟\n\ |
|
|
⎝ cos (φ)⎠\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = {x: sin(x)} |
|
|
expr_2 = Dict({x: sin(x)}) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
{x: sin(x)}\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
{x: sin(x)}\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert pretty(expr_2) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
assert upretty(expr_2) == ucode_str |
|
|
|
|
|
expr = {1/x: 1/y, x: sin(x)**2} |
|
|
expr_2 = Dict({1/x: 1/y, x: sin(x)**2}) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
1 1 2 \n\ |
|
|
{-: -, x: sin (x)}\n\ |
|
|
x y \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎧1 1 2 ⎫\n\ |
|
|
⎨─: ─, x: sin (x)⎬\n\ |
|
|
⎩x y ⎭\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert pretty(expr_2) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
assert upretty(expr_2) == ucode_str |
|
|
|
|
|
|
|
|
expr = [x**2] |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
[x ]\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎡ 2⎤\n\ |
|
|
⎣x ⎦\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = (x**2,) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
(x ,)\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛ 2 ⎞\n\ |
|
|
⎝x ,⎠\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Tuple(x**2) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
(x ,)\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛ 2 ⎞\n\ |
|
|
⎝x ,⎠\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = {x**2: 1} |
|
|
expr_2 = Dict({x**2: 1}) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
{x : 1}\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎧ 2 ⎫\n\ |
|
|
⎨x : 1⎬\n\ |
|
|
⎩ ⎭\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert pretty(expr_2) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
assert upretty(expr_2) == ucode_str |
|
|
|
|
|
|
|
|
def test_any_object_in_sequence(): |
|
|
|
|
|
b1 = Basic() |
|
|
b2 = Basic(Basic()) |
|
|
|
|
|
expr = [b2, b1] |
|
|
assert pretty(expr) == "[Basic(Basic()), Basic()]" |
|
|
assert upretty(expr) == "[Basic(Basic()), Basic()]" |
|
|
|
|
|
expr = {b2, b1} |
|
|
assert pretty(expr) == "{Basic(), Basic(Basic())}" |
|
|
assert upretty(expr) == "{Basic(), Basic(Basic())}" |
|
|
|
|
|
expr = {b2: b1, b1: b2} |
|
|
expr2 = Dict({b2: b1, b1: b2}) |
|
|
assert pretty(expr) == "{Basic(): Basic(Basic()), Basic(Basic()): Basic()}" |
|
|
assert pretty( |
|
|
expr2) == "{Basic(): Basic(Basic()), Basic(Basic()): Basic()}" |
|
|
assert upretty( |
|
|
expr) == "{Basic(): Basic(Basic()), Basic(Basic()): Basic()}" |
|
|
assert upretty( |
|
|
expr2) == "{Basic(): Basic(Basic()), Basic(Basic()): Basic()}" |
|
|
|
|
|
|
|
|
def test_print_builtin_set(): |
|
|
assert pretty(set()) == 'set()' |
|
|
assert upretty(set()) == 'set()' |
|
|
|
|
|
assert pretty(frozenset()) == 'frozenset()' |
|
|
assert upretty(frozenset()) == 'frozenset()' |
|
|
|
|
|
s1 = {1/x, x} |
|
|
s2 = frozenset(s1) |
|
|
|
|
|
assert pretty(s1) == \ |
|
|
"""\ |
|
|
1 \n\ |
|
|
{-, x} |
|
|
x \ |
|
|
""" |
|
|
assert upretty(s1) == \ |
|
|
"""\ |
|
|
⎧1 ⎫ |
|
|
⎨─, x⎬ |
|
|
⎩x ⎭\ |
|
|
""" |
|
|
|
|
|
assert pretty(s2) == \ |
|
|
"""\ |
|
|
1 \n\ |
|
|
frozenset({-, x}) |
|
|
x \ |
|
|
""" |
|
|
assert upretty(s2) == \ |
|
|
"""\ |
|
|
⎛⎧1 ⎫⎞ |
|
|
frozenset⎜⎨─, x⎬⎟ |
|
|
⎝⎩x ⎭⎠\ |
|
|
""" |
|
|
|
|
|
|
|
|
def test_pretty_sets(): |
|
|
s = FiniteSet |
|
|
assert pretty(s(*[x*y, x**2])) == \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
{x , x*y}\ |
|
|
""" |
|
|
assert pretty(s(*range(1, 6))) == "{1, 2, 3, 4, 5}" |
|
|
assert pretty(s(*range(1, 13))) == "{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}" |
|
|
|
|
|
assert pretty({x*y, x**2}) == \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
{x , x*y}\ |
|
|
""" |
|
|
assert pretty(set(range(1, 6))) == "{1, 2, 3, 4, 5}" |
|
|
assert pretty(set(range(1, 13))) == \ |
|
|
"{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}" |
|
|
|
|
|
assert pretty(frozenset([x*y, x**2])) == \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
frozenset({x , x*y})\ |
|
|
""" |
|
|
assert pretty(frozenset(range(1, 6))) == "frozenset({1, 2, 3, 4, 5})" |
|
|
assert pretty(frozenset(range(1, 13))) == \ |
|
|
"frozenset({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12})" |
|
|
|
|
|
assert pretty(Range(0, 3, 1)) == '{0, 1, 2}' |
|
|
|
|
|
ascii_str = '{0, 1, ..., 29}' |
|
|
ucode_str = '{0, 1, …, 29}' |
|
|
assert pretty(Range(0, 30, 1)) == ascii_str |
|
|
assert upretty(Range(0, 30, 1)) == ucode_str |
|
|
|
|
|
ascii_str = '{30, 29, ..., 2}' |
|
|
ucode_str = '{30, 29, …, 2}' |
|
|
assert pretty(Range(30, 1, -1)) == ascii_str |
|
|
assert upretty(Range(30, 1, -1)) == ucode_str |
|
|
|
|
|
ascii_str = '{0, 2, ...}' |
|
|
ucode_str = '{0, 2, …}' |
|
|
assert pretty(Range(0, oo, 2)) == ascii_str |
|
|
assert upretty(Range(0, oo, 2)) == ucode_str |
|
|
|
|
|
ascii_str = '{..., 2, 0}' |
|
|
ucode_str = '{…, 2, 0}' |
|
|
assert pretty(Range(oo, -2, -2)) == ascii_str |
|
|
assert upretty(Range(oo, -2, -2)) == ucode_str |
|
|
|
|
|
ascii_str = '{-2, -3, ...}' |
|
|
ucode_str = '{-2, -3, …}' |
|
|
assert pretty(Range(-2, -oo, -1)) == ascii_str |
|
|
assert upretty(Range(-2, -oo, -1)) == ucode_str |
|
|
|
|
|
|
|
|
def test_pretty_SetExpr(): |
|
|
iv = Interval(1, 3) |
|
|
se = SetExpr(iv) |
|
|
ascii_str = "SetExpr([1, 3])" |
|
|
ucode_str = "SetExpr([1, 3])" |
|
|
assert pretty(se) == ascii_str |
|
|
assert upretty(se) == ucode_str |
|
|
|
|
|
|
|
|
def test_pretty_ImageSet(): |
|
|
imgset = ImageSet(Lambda((x, y), x + y), {1, 2, 3}, {3, 4}) |
|
|
ascii_str = '{x + y | x in {1, 2, 3}, y in {3, 4}}' |
|
|
ucode_str = '{x + y │ x ∊ {1, 2, 3}, y ∊ {3, 4}}' |
|
|
assert pretty(imgset) == ascii_str |
|
|
assert upretty(imgset) == ucode_str |
|
|
|
|
|
imgset = ImageSet(Lambda(((x, y),), x + y), ProductSet({1, 2, 3}, {3, 4})) |
|
|
ascii_str = '{x + y | (x, y) in {1, 2, 3} x {3, 4}}' |
|
|
ucode_str = '{x + y │ (x, y) ∊ {1, 2, 3} × {3, 4}}' |
|
|
assert pretty(imgset) == ascii_str |
|
|
assert upretty(imgset) == ucode_str |
|
|
|
|
|
imgset = ImageSet(Lambda(x, x**2), S.Naturals) |
|
|
ascii_str = '''\ |
|
|
2 \n\ |
|
|
{x | x in Naturals}''' |
|
|
ucode_str = '''\ |
|
|
⎧ 2 │ ⎫\n\ |
|
|
⎨x │ x ∊ ℕ⎬\n\ |
|
|
⎩ │ ⎭''' |
|
|
assert pretty(imgset) == ascii_str |
|
|
assert upretty(imgset) == ucode_str |
|
|
|
|
|
|
|
|
|
|
|
imgset = ImageSet(Lambda(x, 1/x**2), S.Naturals) |
|
|
ascii_str = '''\ |
|
|
1 \n\ |
|
|
{-- | x in Naturals} |
|
|
2 \n\ |
|
|
x ''' |
|
|
ucode_str = '''\ |
|
|
⎧1 │ ⎫\n\ |
|
|
⎪── │ x ∊ ℕ⎪\n\ |
|
|
⎨ 2 │ ⎬\n\ |
|
|
⎪x │ ⎪\n\ |
|
|
⎩ │ ⎭''' |
|
|
assert pretty(imgset) == ascii_str |
|
|
assert upretty(imgset) == ucode_str |
|
|
|
|
|
imgset = ImageSet(Lambda((x, y), 1/(x + y)**2), S.Naturals, S.Naturals) |
|
|
ascii_str = '''\ |
|
|
1 \n\ |
|
|
{-------- | x in Naturals, y in Naturals} |
|
|
2 \n\ |
|
|
(x + y) ''' |
|
|
ucode_str = '''\ |
|
|
⎧ 1 │ ⎫ |
|
|
⎪──────── │ x ∊ ℕ, y ∊ ℕ⎪ |
|
|
⎨ 2 │ ⎬ |
|
|
⎪(x + y) │ ⎪ |
|
|
⎩ │ ⎭''' |
|
|
assert pretty(imgset) == ascii_str |
|
|
assert upretty(imgset) == ucode_str |
|
|
|
|
|
|
|
|
assert upretty([Symbol("ihat") / (Symbol("i") + 1)]) == '''\ |
|
|
⎡ î ⎤ |
|
|
⎢─────⎥ |
|
|
⎣i + 1⎦\ |
|
|
''' |
|
|
assert upretty(Matrix([Symbol("ihat"), Symbol("i") + 1])) == '''\ |
|
|
⎡ î ⎤ |
|
|
⎢ ⎥ |
|
|
⎣i + 1⎦\ |
|
|
''' |
|
|
|
|
|
|
|
|
def test_pretty_ConditionSet(): |
|
|
ascii_str = '{x | x in (-oo, oo) and sin(x) = 0}' |
|
|
ucode_str = '{x │ x ∊ ℝ ∧ (sin(x) = 0)}' |
|
|
assert pretty(ConditionSet(x, Eq(sin(x), 0), S.Reals)) == ascii_str |
|
|
assert upretty(ConditionSet(x, Eq(sin(x), 0), S.Reals)) == ucode_str |
|
|
|
|
|
assert pretty(ConditionSet(x, Contains(x, S.Reals, evaluate=False), FiniteSet(1))) == '{1}' |
|
|
assert upretty(ConditionSet(x, Contains(x, S.Reals, evaluate=False), FiniteSet(1))) == '{1}' |
|
|
|
|
|
assert pretty(ConditionSet(x, And(x > 1, x < -1), FiniteSet(1, 2, 3))) == "EmptySet" |
|
|
assert upretty(ConditionSet(x, And(x > 1, x < -1), FiniteSet(1, 2, 3))) == "∅" |
|
|
|
|
|
assert pretty(ConditionSet(x, Or(x > 1, x < -1), FiniteSet(1, 2))) == '{2}' |
|
|
assert upretty(ConditionSet(x, Or(x > 1, x < -1), FiniteSet(1, 2))) == '{2}' |
|
|
|
|
|
condset = ConditionSet(x, 1/x**2 > 0) |
|
|
ascii_str = '''\ |
|
|
1 \n\ |
|
|
{x | -- > 0} |
|
|
2 \n\ |
|
|
x ''' |
|
|
ucode_str = '''\ |
|
|
⎧ │ ⎛1 ⎞⎫ |
|
|
⎪x │ ⎜── > 0⎟⎪ |
|
|
⎨ │ ⎜ 2 ⎟⎬ |
|
|
⎪ │ ⎝x ⎠⎪ |
|
|
⎩ │ ⎭''' |
|
|
assert pretty(condset) == ascii_str |
|
|
assert upretty(condset) == ucode_str |
|
|
|
|
|
condset = ConditionSet(x, 1/x**2 > 0, S.Reals) |
|
|
ascii_str = '''\ |
|
|
1 \n\ |
|
|
{x | x in (-oo, oo) and -- > 0} |
|
|
2 \n\ |
|
|
x ''' |
|
|
ucode_str = '''\ |
|
|
⎧ │ ⎛1 ⎞⎫ |
|
|
⎪x │ x ∊ ℝ ∧ ⎜── > 0⎟⎪ |
|
|
⎨ │ ⎜ 2 ⎟⎬ |
|
|
⎪ │ ⎝x ⎠⎪ |
|
|
⎩ │ ⎭''' |
|
|
assert pretty(condset) == ascii_str |
|
|
assert upretty(condset) == ucode_str |
|
|
|
|
|
|
|
|
def test_pretty_ComplexRegion(): |
|
|
from sympy.sets.fancysets import ComplexRegion |
|
|
cregion = ComplexRegion(Interval(3, 5)*Interval(4, 6)) |
|
|
ascii_str = '{x + y*I | x, y in [3, 5] x [4, 6]}' |
|
|
ucode_str = '{x + y⋅ⅈ │ x, y ∊ [3, 5] × [4, 6]}' |
|
|
assert pretty(cregion) == ascii_str |
|
|
assert upretty(cregion) == ucode_str |
|
|
|
|
|
cregion = ComplexRegion(Interval(0, 1)*Interval(0, 2*pi), polar=True) |
|
|
ascii_str = '{r*(I*sin(theta) + cos(theta)) | r, theta in [0, 1] x [0, 2*pi)}' |
|
|
ucode_str = '{r⋅(ⅈ⋅sin(θ) + cos(θ)) │ r, θ ∊ [0, 1] × [0, 2⋅π)}' |
|
|
assert pretty(cregion) == ascii_str |
|
|
assert upretty(cregion) == ucode_str |
|
|
|
|
|
cregion = ComplexRegion(Interval(3, 1/a**2)*Interval(4, 6)) |
|
|
ascii_str = '''\ |
|
|
1 \n\ |
|
|
{x + y*I | x, y in [3, --] x [4, 6]} |
|
|
2 \n\ |
|
|
a ''' |
|
|
ucode_str = '''\ |
|
|
⎧ │ ⎡ 1 ⎤ ⎫ |
|
|
⎪x + y⋅ⅈ │ x, y ∊ ⎢3, ──⎥ × [4, 6]⎪ |
|
|
⎨ │ ⎢ 2⎥ ⎬ |
|
|
⎪ │ ⎣ a ⎦ ⎪ |
|
|
⎩ │ ⎭''' |
|
|
assert pretty(cregion) == ascii_str |
|
|
assert upretty(cregion) == ucode_str |
|
|
|
|
|
cregion = ComplexRegion(Interval(0, 1/a**2)*Interval(0, 2*pi), polar=True) |
|
|
ascii_str = '''\ |
|
|
1 \n\ |
|
|
{r*(I*sin(theta) + cos(theta)) | r, theta in [0, --] x [0, 2*pi)} |
|
|
2 \n\ |
|
|
a ''' |
|
|
ucode_str = '''\ |
|
|
⎧ │ ⎡ 1 ⎤ ⎫ |
|
|
⎪r⋅(ⅈ⋅sin(θ) + cos(θ)) │ r, θ ∊ ⎢0, ──⎥ × [0, 2⋅π)⎪ |
|
|
⎨ │ ⎢ 2⎥ ⎬ |
|
|
⎪ │ ⎣ a ⎦ ⎪ |
|
|
⎩ │ ⎭''' |
|
|
assert pretty(cregion) == ascii_str |
|
|
assert upretty(cregion) == ucode_str |
|
|
|
|
|
|
|
|
def test_pretty_Union_issue_10414(): |
|
|
a, b = Interval(2, 3), Interval(4, 7) |
|
|
ucode_str = '[2, 3] ∪ [4, 7]' |
|
|
ascii_str = '[2, 3] U [4, 7]' |
|
|
assert upretty(Union(a, b)) == ucode_str |
|
|
assert pretty(Union(a, b)) == ascii_str |
|
|
|
|
|
|
|
|
def test_pretty_Intersection_issue_10414(): |
|
|
x, y, z, w = symbols('x, y, z, w') |
|
|
a, b = Interval(x, y), Interval(z, w) |
|
|
ucode_str = '[x, y] ∩ [z, w]' |
|
|
ascii_str = '[x, y] n [z, w]' |
|
|
assert upretty(Intersection(a, b)) == ucode_str |
|
|
assert pretty(Intersection(a, b)) == ascii_str |
|
|
|
|
|
|
|
|
def test_ProductSet_exponent(): |
|
|
ucode_str = ' 1\n[0, 1] ' |
|
|
assert upretty(Interval(0, 1)**1) == ucode_str |
|
|
ucode_str = ' 2\n[0, 1] ' |
|
|
assert upretty(Interval(0, 1)**2) == ucode_str |
|
|
|
|
|
|
|
|
def test_ProductSet_parenthesis(): |
|
|
ucode_str = '([4, 7] × {1, 2}) ∪ ([2, 3] × [4, 7])' |
|
|
|
|
|
a, b = Interval(2, 3), Interval(4, 7) |
|
|
assert upretty(Union(a*b, b*FiniteSet(1, 2))) == ucode_str |
|
|
|
|
|
|
|
|
def test_ProductSet_prod_char_issue_10413(): |
|
|
ascii_str = '[2, 3] x [4, 7]' |
|
|
ucode_str = '[2, 3] × [4, 7]' |
|
|
|
|
|
a, b = Interval(2, 3), Interval(4, 7) |
|
|
assert pretty(a*b) == ascii_str |
|
|
assert upretty(a*b) == ucode_str |
|
|
|
|
|
|
|
|
def test_pretty_sequences(): |
|
|
s1 = SeqFormula(a**2, (0, oo)) |
|
|
s2 = SeqPer((1, 2)) |
|
|
|
|
|
ascii_str = '[0, 1, 4, 9, ...]' |
|
|
ucode_str = '[0, 1, 4, 9, …]' |
|
|
|
|
|
assert pretty(s1) == ascii_str |
|
|
assert upretty(s1) == ucode_str |
|
|
|
|
|
ascii_str = '[1, 2, 1, 2, ...]' |
|
|
ucode_str = '[1, 2, 1, 2, …]' |
|
|
assert pretty(s2) == ascii_str |
|
|
assert upretty(s2) == ucode_str |
|
|
|
|
|
s3 = SeqFormula(a**2, (0, 2)) |
|
|
s4 = SeqPer((1, 2), (0, 2)) |
|
|
|
|
|
ascii_str = '[0, 1, 4]' |
|
|
ucode_str = '[0, 1, 4]' |
|
|
|
|
|
assert pretty(s3) == ascii_str |
|
|
assert upretty(s3) == ucode_str |
|
|
|
|
|
ascii_str = '[1, 2, 1]' |
|
|
ucode_str = '[1, 2, 1]' |
|
|
assert pretty(s4) == ascii_str |
|
|
assert upretty(s4) == ucode_str |
|
|
|
|
|
s5 = SeqFormula(a**2, (-oo, 0)) |
|
|
s6 = SeqPer((1, 2), (-oo, 0)) |
|
|
|
|
|
ascii_str = '[..., 9, 4, 1, 0]' |
|
|
ucode_str = '[…, 9, 4, 1, 0]' |
|
|
|
|
|
assert pretty(s5) == ascii_str |
|
|
assert upretty(s5) == ucode_str |
|
|
|
|
|
ascii_str = '[..., 2, 1, 2, 1]' |
|
|
ucode_str = '[…, 2, 1, 2, 1]' |
|
|
assert pretty(s6) == ascii_str |
|
|
assert upretty(s6) == ucode_str |
|
|
|
|
|
ascii_str = '[1, 3, 5, 11, ...]' |
|
|
ucode_str = '[1, 3, 5, 11, …]' |
|
|
|
|
|
assert pretty(SeqAdd(s1, s2)) == ascii_str |
|
|
assert upretty(SeqAdd(s1, s2)) == ucode_str |
|
|
|
|
|
ascii_str = '[1, 3, 5]' |
|
|
ucode_str = '[1, 3, 5]' |
|
|
|
|
|
assert pretty(SeqAdd(s3, s4)) == ascii_str |
|
|
assert upretty(SeqAdd(s3, s4)) == ucode_str |
|
|
|
|
|
ascii_str = '[..., 11, 5, 3, 1]' |
|
|
ucode_str = '[…, 11, 5, 3, 1]' |
|
|
|
|
|
assert pretty(SeqAdd(s5, s6)) == ascii_str |
|
|
assert upretty(SeqAdd(s5, s6)) == ucode_str |
|
|
|
|
|
ascii_str = '[0, 2, 4, 18, ...]' |
|
|
ucode_str = '[0, 2, 4, 18, …]' |
|
|
|
|
|
assert pretty(SeqMul(s1, s2)) == ascii_str |
|
|
assert upretty(SeqMul(s1, s2)) == ucode_str |
|
|
|
|
|
ascii_str = '[0, 2, 4]' |
|
|
ucode_str = '[0, 2, 4]' |
|
|
|
|
|
assert pretty(SeqMul(s3, s4)) == ascii_str |
|
|
assert upretty(SeqMul(s3, s4)) == ucode_str |
|
|
|
|
|
ascii_str = '[..., 18, 4, 2, 0]' |
|
|
ucode_str = '[…, 18, 4, 2, 0]' |
|
|
|
|
|
assert pretty(SeqMul(s5, s6)) == ascii_str |
|
|
assert upretty(SeqMul(s5, s6)) == ucode_str |
|
|
|
|
|
|
|
|
s7 = SeqFormula(a**2, (a, 0, x)) |
|
|
raises(NotImplementedError, lambda: pretty(s7)) |
|
|
raises(NotImplementedError, lambda: upretty(s7)) |
|
|
|
|
|
b = Symbol('b') |
|
|
s8 = SeqFormula(b*a**2, (a, 0, 2)) |
|
|
ascii_str = '[0, b, 4*b]' |
|
|
ucode_str = '[0, b, 4⋅b]' |
|
|
assert pretty(s8) == ascii_str |
|
|
assert upretty(s8) == ucode_str |
|
|
|
|
|
|
|
|
def test_pretty_FourierSeries(): |
|
|
f = fourier_series(x, (x, -pi, pi)) |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2*sin(3*x) \n\ |
|
|
2*sin(x) - sin(2*x) + ---------- + ...\n\ |
|
|
3 \ |
|
|
""" |
|
|
|
|
|
ucode_str = \ |
|
|
"""\ |
|
|
2⋅sin(3⋅x) \n\ |
|
|
2⋅sin(x) - sin(2⋅x) + ────────── + …\n\ |
|
|
3 \ |
|
|
""" |
|
|
|
|
|
assert pretty(f) == ascii_str |
|
|
assert upretty(f) == ucode_str |
|
|
|
|
|
|
|
|
def test_pretty_FormalPowerSeries(): |
|
|
f = fps(log(1 + x)) |
|
|
|
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
oo \n\ |
|
|
____ \n\ |
|
|
\\ ` \n\ |
|
|
\\ -k k \n\ |
|
|
\\ -(-1) *x \n\ |
|
|
/ -----------\n\ |
|
|
/ k \n\ |
|
|
/___, \n\ |
|
|
k = 1 \ |
|
|
""" |
|
|
|
|
|
ucode_str = \ |
|
|
"""\ |
|
|
∞ \n\ |
|
|
____ \n\ |
|
|
╲ \n\ |
|
|
╲ -k k \n\ |
|
|
╲ -(-1) ⋅x \n\ |
|
|
╱ ───────────\n\ |
|
|
╱ k \n\ |
|
|
╱ \n\ |
|
|
‾‾‾‾ \n\ |
|
|
k = 1 \ |
|
|
""" |
|
|
|
|
|
assert pretty(f) == ascii_str |
|
|
assert upretty(f) == ucode_str |
|
|
|
|
|
|
|
|
def test_pretty_limits(): |
|
|
expr = Limit(x, x, oo) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
lim x\n\ |
|
|
x->oo \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
lim x\n\ |
|
|
x─→∞ \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Limit(x**2, x, 0) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2\n\ |
|
|
lim x \n\ |
|
|
x->0+ \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
2\n\ |
|
|
lim x \n\ |
|
|
x─→0⁺ \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Limit(1/x, x, 0) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
1\n\ |
|
|
lim -\n\ |
|
|
x->0+x\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
1\n\ |
|
|
lim ─\n\ |
|
|
x─→0⁺x\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Limit(sin(x)/x, x, 0) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/sin(x)\\\n\ |
|
|
lim |------|\n\ |
|
|
x->0+\\ x /\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛sin(x)⎞\n\ |
|
|
lim ⎜──────⎟\n\ |
|
|
x─→0⁺⎝ x ⎠\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Limit(sin(x)/x, x, 0, "-") |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/sin(x)\\\n\ |
|
|
lim |------|\n\ |
|
|
x->0-\\ x /\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛sin(x)⎞\n\ |
|
|
lim ⎜──────⎟\n\ |
|
|
x─→0⁻⎝ x ⎠\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Limit(x + sin(x), x, 0) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
lim (x + sin(x))\n\ |
|
|
x->0+ \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
lim (x + sin(x))\n\ |
|
|
x─→0⁺ \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Limit(x, x, 0)**2 |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2\n\ |
|
|
/ lim x\\ \n\ |
|
|
\\x->0+ / \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
2\n\ |
|
|
⎛ lim x⎞ \n\ |
|
|
⎝x─→0⁺ ⎠ \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Limit(x*Limit(y/2,y,0), x, 0) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ /y\\\\\n\ |
|
|
lim |x* lim |-||\n\ |
|
|
x->0+\\ y->0+\\2//\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛ ⎛y⎞⎞\n\ |
|
|
lim ⎜x⋅ lim ⎜─⎟⎟\n\ |
|
|
x─→0⁺⎝ y─→0⁺⎝2⎠⎠\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = 2*Limit(x*Limit(y/2,y,0), x, 0) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ /y\\\\\n\ |
|
|
2* lim |x* lim |-||\n\ |
|
|
x->0+\\ y->0+\\2//\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛ ⎛y⎞⎞\n\ |
|
|
2⋅ lim ⎜x⋅ lim ⎜─⎟⎟\n\ |
|
|
x─→0⁺⎝ y─→0⁺⎝2⎠⎠\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Limit(sin(x), x, 0, dir='+-') |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
lim sin(x)\n\ |
|
|
x->0 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
lim sin(x)\n\ |
|
|
x─→0 \ |
|
|
""" |
|
|
|
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_pretty_ComplexRootOf(): |
|
|
expr = rootof(x**5 + 11*x - 2, 0) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ 5 \\\n\ |
|
|
CRootOf\\x + 11*x - 2, 0/\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛ 5 ⎞\n\ |
|
|
CRootOf⎝x + 11⋅x - 2, 0⎠\ |
|
|
""" |
|
|
|
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_pretty_RootSum(): |
|
|
expr = RootSum(x**5 + 11*x - 2, auto=False) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ 5 \\\n\ |
|
|
RootSum\\x + 11*x - 2/\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛ 5 ⎞\n\ |
|
|
RootSum⎝x + 11⋅x - 2⎠\ |
|
|
""" |
|
|
|
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = RootSum(x**5 + 11*x - 2, Lambda(z, exp(z))) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ 5 z\\\n\ |
|
|
RootSum\\x + 11*x - 2, z -> e /\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛ 5 z⎞\n\ |
|
|
RootSum⎝x + 11⋅x - 2, z ↦ ℯ ⎠\ |
|
|
""" |
|
|
|
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_GroebnerBasis(): |
|
|
expr = groebner([], x, y) |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
GroebnerBasis([], x, y, domain=ZZ, order=lex)\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
GroebnerBasis([], x, y, domain=ℤ, order=lex)\ |
|
|
""" |
|
|
|
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
F = [x**2 - 3*y - x + 1, y**2 - 2*x + y - 1] |
|
|
expr = groebner(F, x, y, order='grlex') |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/[ 2 2 ] \\\n\ |
|
|
GroebnerBasis\\[x - x - 3*y + 1, y - 2*x + y - 1], x, y, domain=ZZ, order=grlex/\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛⎡ 2 2 ⎤ ⎞\n\ |
|
|
GroebnerBasis⎝⎣x - x - 3⋅y + 1, y - 2⋅x + y - 1⎦, x, y, domain=ℤ, order=grlex⎠\ |
|
|
""" |
|
|
|
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = expr.fglm('lex') |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/[ 2 4 3 2 ] \\\n\ |
|
|
GroebnerBasis\\[2*x - y - y + 1, y + 2*y - 3*y - 16*y + 7], x, y, domain=ZZ, order=lex/\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛⎡ 2 4 3 2 ⎤ ⎞\n\ |
|
|
GroebnerBasis⎝⎣2⋅x - y - y + 1, y + 2⋅y - 3⋅y - 16⋅y + 7⎦, x, y, domain=ℤ, order=lex⎠\ |
|
|
""" |
|
|
|
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_pretty_UniversalSet(): |
|
|
assert pretty(S.UniversalSet) == "UniversalSet" |
|
|
assert upretty(S.UniversalSet) == '𝕌' |
|
|
|
|
|
|
|
|
def test_pretty_Boolean(): |
|
|
expr = Not(x, evaluate=False) |
|
|
|
|
|
assert pretty(expr) == "Not(x)" |
|
|
assert upretty(expr) == "¬x" |
|
|
|
|
|
expr = And(x, y) |
|
|
|
|
|
assert pretty(expr) == "And(x, y)" |
|
|
assert upretty(expr) == "x ∧ y" |
|
|
|
|
|
expr = Or(x, y) |
|
|
|
|
|
assert pretty(expr) == "Or(x, y)" |
|
|
assert upretty(expr) == "x ∨ y" |
|
|
|
|
|
syms = symbols('a:f') |
|
|
expr = And(*syms) |
|
|
|
|
|
assert pretty(expr) == "And(a, b, c, d, e, f)" |
|
|
assert upretty(expr) == "a ∧ b ∧ c ∧ d ∧ e ∧ f" |
|
|
|
|
|
expr = Or(*syms) |
|
|
|
|
|
assert pretty(expr) == "Or(a, b, c, d, e, f)" |
|
|
assert upretty(expr) == "a ∨ b ∨ c ∨ d ∨ e ∨ f" |
|
|
|
|
|
expr = Xor(x, y, evaluate=False) |
|
|
|
|
|
assert pretty(expr) == "Xor(x, y)" |
|
|
assert upretty(expr) == "x ⊻ y" |
|
|
|
|
|
expr = Nand(x, y, evaluate=False) |
|
|
|
|
|
assert pretty(expr) == "Nand(x, y)" |
|
|
assert upretty(expr) == "x ⊼ y" |
|
|
|
|
|
expr = Nor(x, y, evaluate=False) |
|
|
|
|
|
assert pretty(expr) == "Nor(x, y)" |
|
|
assert upretty(expr) == "x ⊽ y" |
|
|
|
|
|
expr = Implies(x, y, evaluate=False) |
|
|
|
|
|
assert pretty(expr) == "Implies(x, y)" |
|
|
assert upretty(expr) == "x → y" |
|
|
|
|
|
|
|
|
expr = Implies(y, x, evaluate=False) |
|
|
|
|
|
assert pretty(expr) == "Implies(y, x)" |
|
|
assert upretty(expr) == "y → x" |
|
|
|
|
|
expr = Equivalent(x, y, evaluate=False) |
|
|
|
|
|
assert pretty(expr) == "Equivalent(x, y)" |
|
|
assert upretty(expr) == "x ⇔ y" |
|
|
|
|
|
expr = Equivalent(y, x, evaluate=False) |
|
|
|
|
|
assert pretty(expr) == "Equivalent(x, y)" |
|
|
assert upretty(expr) == "x ⇔ y" |
|
|
|
|
|
|
|
|
def test_pretty_Domain(): |
|
|
expr = FF(23) |
|
|
|
|
|
assert pretty(expr) == "GF(23)" |
|
|
assert upretty(expr) == "ℤ₂₃" |
|
|
|
|
|
expr = ZZ |
|
|
|
|
|
assert pretty(expr) == "ZZ" |
|
|
assert upretty(expr) == "ℤ" |
|
|
|
|
|
expr = QQ |
|
|
|
|
|
assert pretty(expr) == "QQ" |
|
|
assert upretty(expr) == "ℚ" |
|
|
|
|
|
expr = RR |
|
|
|
|
|
assert pretty(expr) == "RR" |
|
|
assert upretty(expr) == "ℝ" |
|
|
|
|
|
expr = QQ[x] |
|
|
|
|
|
assert pretty(expr) == "QQ[x]" |
|
|
assert upretty(expr) == "ℚ[x]" |
|
|
|
|
|
expr = QQ[x, y] |
|
|
|
|
|
assert pretty(expr) == "QQ[x, y]" |
|
|
assert upretty(expr) == "ℚ[x, y]" |
|
|
|
|
|
expr = ZZ.frac_field(x) |
|
|
|
|
|
assert pretty(expr) == "ZZ(x)" |
|
|
assert upretty(expr) == "ℤ(x)" |
|
|
|
|
|
expr = ZZ.frac_field(x, y) |
|
|
|
|
|
assert pretty(expr) == "ZZ(x, y)" |
|
|
assert upretty(expr) == "ℤ(x, y)" |
|
|
|
|
|
expr = QQ.poly_ring(x, y, order=grlex) |
|
|
|
|
|
assert pretty(expr) == "QQ[x, y, order=grlex]" |
|
|
assert upretty(expr) == "ℚ[x, y, order=grlex]" |
|
|
|
|
|
expr = QQ.poly_ring(x, y, order=ilex) |
|
|
|
|
|
assert pretty(expr) == "QQ[x, y, order=ilex]" |
|
|
assert upretty(expr) == "ℚ[x, y, order=ilex]" |
|
|
|
|
|
|
|
|
def test_pretty_prec(): |
|
|
assert xpretty(S("0.3"), full_prec=True, wrap_line=False) == "0.300000000000000" |
|
|
assert xpretty(S("0.3"), full_prec="auto", wrap_line=False) == "0.300000000000000" |
|
|
assert xpretty(S("0.3"), full_prec=False, wrap_line=False) == "0.3" |
|
|
assert xpretty(S("0.3")*x, full_prec=True, use_unicode=False, wrap_line=False) in [ |
|
|
"0.300000000000000*x", |
|
|
"x*0.300000000000000" |
|
|
] |
|
|
assert xpretty(S("0.3")*x, full_prec="auto", use_unicode=False, wrap_line=False) in [ |
|
|
"0.3*x", |
|
|
"x*0.3" |
|
|
] |
|
|
assert xpretty(S("0.3")*x, full_prec=False, use_unicode=False, wrap_line=False) in [ |
|
|
"0.3*x", |
|
|
"x*0.3" |
|
|
] |
|
|
|
|
|
|
|
|
def test_pprint(): |
|
|
import sys |
|
|
from io import StringIO |
|
|
fd = StringIO() |
|
|
sso = sys.stdout |
|
|
sys.stdout = fd |
|
|
try: |
|
|
pprint(pi, use_unicode=False, wrap_line=False) |
|
|
finally: |
|
|
sys.stdout = sso |
|
|
assert fd.getvalue() == 'pi\n' |
|
|
|
|
|
|
|
|
def test_pretty_class(): |
|
|
"""Test that the printer dispatcher correctly handles classes.""" |
|
|
class C: |
|
|
pass |
|
|
|
|
|
class D: |
|
|
pass |
|
|
|
|
|
assert pretty( C ) == str( C ) |
|
|
assert pretty( D ) == str( D ) |
|
|
|
|
|
|
|
|
def test_pretty_no_wrap_line(): |
|
|
huge_expr = 0 |
|
|
for i in range(20): |
|
|
huge_expr += i*sin(i + x) |
|
|
assert xpretty(huge_expr ).find('\n') != -1 |
|
|
assert xpretty(huge_expr, wrap_line=False).find('\n') == -1 |
|
|
|
|
|
|
|
|
def test_settings(): |
|
|
raises(TypeError, lambda: pretty(S(4), method="garbage")) |
|
|
|
|
|
|
|
|
def test_pretty_sum(): |
|
|
from sympy.abc import x, a, b, k, m, n |
|
|
|
|
|
expr = Sum(k**k, (k, 0, n)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
n \n\ |
|
|
___ \n\ |
|
|
\\ ` \n\ |
|
|
\\ k\n\ |
|
|
/ k \n\ |
|
|
/__, \n\ |
|
|
k = 0 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
n \n\ |
|
|
___ \n\ |
|
|
╲ \n\ |
|
|
╲ k\n\ |
|
|
╱ k \n\ |
|
|
╱ \n\ |
|
|
‾‾‾ \n\ |
|
|
k = 0 \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Sum(k**k, (k, oo, n)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
n \n\ |
|
|
___ \n\ |
|
|
\\ ` \n\ |
|
|
\\ k\n\ |
|
|
/ k \n\ |
|
|
/__, \n\ |
|
|
k = oo \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
n \n\ |
|
|
___ \n\ |
|
|
╲ \n\ |
|
|
╲ k\n\ |
|
|
╱ k \n\ |
|
|
╱ \n\ |
|
|
‾‾‾ \n\ |
|
|
k = ∞ \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Sum(k**(Integral(x**n, (x, -oo, oo))), (k, 0, n**n)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
n \n\ |
|
|
n \n\ |
|
|
______ \n\ |
|
|
\\ ` \n\ |
|
|
\\ oo \n\ |
|
|
\\ / \n\ |
|
|
\\ | \n\ |
|
|
\\ | n \n\ |
|
|
) | x dx\n\ |
|
|
/ | \n\ |
|
|
/ / \n\ |
|
|
/ -oo \n\ |
|
|
/ k \n\ |
|
|
/_____, \n\ |
|
|
k = 0 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
n \n\ |
|
|
n \n\ |
|
|
______ \n\ |
|
|
╲ \n\ |
|
|
╲ \n\ |
|
|
╲ ∞ \n\ |
|
|
╲ ⌠ \n\ |
|
|
╲ ⎮ n \n\ |
|
|
╱ ⎮ x dx\n\ |
|
|
╱ ⌡ \n\ |
|
|
╱ -∞ \n\ |
|
|
╱ k \n\ |
|
|
╱ \n\ |
|
|
‾‾‾‾‾‾ \n\ |
|
|
k = 0 \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Sum(k**( |
|
|
Integral(x**n, (x, -oo, oo))), (k, 0, Integral(x**x, (x, -oo, oo)))) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
oo \n\ |
|
|
/ \n\ |
|
|
| \n\ |
|
|
| x \n\ |
|
|
| x dx \n\ |
|
|
| \n\ |
|
|
/ \n\ |
|
|
-oo \n\ |
|
|
______ \n\ |
|
|
\\ ` \n\ |
|
|
\\ oo \n\ |
|
|
\\ / \n\ |
|
|
\\ | \n\ |
|
|
\\ | n \n\ |
|
|
) | x dx\n\ |
|
|
/ | \n\ |
|
|
/ / \n\ |
|
|
/ -oo \n\ |
|
|
/ k \n\ |
|
|
/_____, \n\ |
|
|
k = 0 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
∞ \n\ |
|
|
⌠ \n\ |
|
|
⎮ x \n\ |
|
|
⎮ x dx \n\ |
|
|
⌡ \n\ |
|
|
-∞ \n\ |
|
|
______ \n\ |
|
|
╲ \n\ |
|
|
╲ \n\ |
|
|
╲ ∞ \n\ |
|
|
╲ ⌠ \n\ |
|
|
╲ ⎮ n \n\ |
|
|
╱ ⎮ x dx\n\ |
|
|
╱ ⌡ \n\ |
|
|
╱ -∞ \n\ |
|
|
╱ k \n\ |
|
|
╱ \n\ |
|
|
‾‾‾‾‾‾ \n\ |
|
|
k = 0 \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Sum(k**(Integral(x**n, (x, -oo, oo))), ( |
|
|
k, x + n + x**2 + n**2 + (x/n) + (1/x), Integral(x**x, (x, -oo, oo)))) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
oo \n\ |
|
|
/ \n\ |
|
|
| \n\ |
|
|
| x \n\ |
|
|
| x dx \n\ |
|
|
| \n\ |
|
|
/ \n\ |
|
|
-oo \n\ |
|
|
______ \n\ |
|
|
\\ ` \n\ |
|
|
\\ oo \n\ |
|
|
\\ / \n\ |
|
|
\\ | \n\ |
|
|
\\ | n \n\ |
|
|
) | x dx\n\ |
|
|
/ | \n\ |
|
|
/ / \n\ |
|
|
/ -oo \n\ |
|
|
/ k \n\ |
|
|
/_____, \n\ |
|
|
2 2 1 x \n\ |
|
|
k = n + n + x + x + - + - \n\ |
|
|
x n \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
∞ \n\ |
|
|
⌠ \n\ |
|
|
⎮ x \n\ |
|
|
⎮ x dx \n\ |
|
|
⌡ \n\ |
|
|
-∞ \n\ |
|
|
______ \n\ |
|
|
╲ \n\ |
|
|
╲ \n\ |
|
|
╲ ∞ \n\ |
|
|
╲ ⌠ \n\ |
|
|
╲ ⎮ n \n\ |
|
|
╱ ⎮ x dx\n\ |
|
|
╱ ⌡ \n\ |
|
|
╱ -∞ \n\ |
|
|
╱ k \n\ |
|
|
╱ \n\ |
|
|
‾‾‾‾‾‾ \n\ |
|
|
2 2 1 x \n\ |
|
|
k = n + n + x + x + ─ + ─ \n\ |
|
|
x n \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Sum(k**( |
|
|
Integral(x**n, (x, -oo, oo))), (k, 0, x + n + x**2 + n**2 + (x/n) + (1/x))) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2 2 1 x \n\ |
|
|
n + n + x + x + - + - \n\ |
|
|
x n \n\ |
|
|
______ \n\ |
|
|
\\ ` \n\ |
|
|
\\ oo \n\ |
|
|
\\ / \n\ |
|
|
\\ | \n\ |
|
|
\\ | n \n\ |
|
|
) | x dx\n\ |
|
|
/ | \n\ |
|
|
/ / \n\ |
|
|
/ -oo \n\ |
|
|
/ k \n\ |
|
|
/_____, \n\ |
|
|
k = 0 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
2 2 1 x \n\ |
|
|
n + n + x + x + ─ + ─ \n\ |
|
|
x n \n\ |
|
|
______ \n\ |
|
|
╲ \n\ |
|
|
╲ \n\ |
|
|
╲ ∞ \n\ |
|
|
╲ ⌠ \n\ |
|
|
╲ ⎮ n \n\ |
|
|
╱ ⎮ x dx\n\ |
|
|
╱ ⌡ \n\ |
|
|
╱ -∞ \n\ |
|
|
╱ k \n\ |
|
|
╱ \n\ |
|
|
‾‾‾‾‾‾ \n\ |
|
|
k = 0 \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Sum(x, (x, 0, oo)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
oo \n\ |
|
|
__ \n\ |
|
|
\\ ` \n\ |
|
|
) x\n\ |
|
|
/_, \n\ |
|
|
x = 0 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
∞ \n\ |
|
|
___ \n\ |
|
|
╲ \n\ |
|
|
╲ \n\ |
|
|
╱ x\n\ |
|
|
╱ \n\ |
|
|
‾‾‾ \n\ |
|
|
x = 0 \ |
|
|
""" |
|
|
|
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Sum(x**2, (x, 0, oo)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
oo \n\ |
|
|
___ \n\ |
|
|
\\ ` \n\ |
|
|
\\ 2\n\ |
|
|
/ x \n\ |
|
|
/__, \n\ |
|
|
x = 0 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
∞ \n\ |
|
|
___ \n\ |
|
|
╲ \n\ |
|
|
╲ 2\n\ |
|
|
╱ x \n\ |
|
|
╱ \n\ |
|
|
‾‾‾ \n\ |
|
|
x = 0 \ |
|
|
""" |
|
|
|
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Sum(x/2, (x, 0, oo)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
oo \n\ |
|
|
___ \n\ |
|
|
\\ ` \n\ |
|
|
\\ x\n\ |
|
|
) -\n\ |
|
|
/ 2\n\ |
|
|
/__, \n\ |
|
|
x = 0 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
∞ \n\ |
|
|
____ \n\ |
|
|
╲ \n\ |
|
|
╲ \n\ |
|
|
╲ x\n\ |
|
|
╱ ─\n\ |
|
|
╱ 2\n\ |
|
|
╱ \n\ |
|
|
‾‾‾‾ \n\ |
|
|
x = 0 \ |
|
|
""" |
|
|
|
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Sum(x**3/2, (x, 0, oo)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
oo \n\ |
|
|
____ \n\ |
|
|
\\ ` \n\ |
|
|
\\ 3\n\ |
|
|
\\ x \n\ |
|
|
/ --\n\ |
|
|
/ 2 \n\ |
|
|
/___, \n\ |
|
|
x = 0 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
∞ \n\ |
|
|
____ \n\ |
|
|
╲ \n\ |
|
|
╲ 3\n\ |
|
|
╲ x \n\ |
|
|
╱ ──\n\ |
|
|
╱ 2 \n\ |
|
|
╱ \n\ |
|
|
‾‾‾‾ \n\ |
|
|
x = 0 \ |
|
|
""" |
|
|
|
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Sum((x**3*y**(x/2))**n, (x, 0, oo)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
oo \n\ |
|
|
____ \n\ |
|
|
\\ ` \n\ |
|
|
\\ n\n\ |
|
|
\\ / x\\ \n\ |
|
|
) | -| \n\ |
|
|
/ | 3 2| \n\ |
|
|
/ \\x *y / \n\ |
|
|
/___, \n\ |
|
|
x = 0 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
∞ \n\ |
|
|
_____ \n\ |
|
|
╲ \n\ |
|
|
╲ \n\ |
|
|
╲ n\n\ |
|
|
╲ ⎛ x⎞ \n\ |
|
|
╱ ⎜ ─⎟ \n\ |
|
|
╱ ⎜ 3 2⎟ \n\ |
|
|
╱ ⎝x ⋅y ⎠ \n\ |
|
|
╱ \n\ |
|
|
‾‾‾‾‾ \n\ |
|
|
x = 0 \ |
|
|
""" |
|
|
|
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Sum(1/x**2, (x, 0, oo)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
oo \n\ |
|
|
____ \n\ |
|
|
\\ ` \n\ |
|
|
\\ 1 \n\ |
|
|
\\ --\n\ |
|
|
/ 2\n\ |
|
|
/ x \n\ |
|
|
/___, \n\ |
|
|
x = 0 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
∞ \n\ |
|
|
____ \n\ |
|
|
╲ \n\ |
|
|
╲ 1 \n\ |
|
|
╲ ──\n\ |
|
|
╱ 2\n\ |
|
|
╱ x \n\ |
|
|
╱ \n\ |
|
|
‾‾‾‾ \n\ |
|
|
x = 0 \ |
|
|
""" |
|
|
|
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Sum(1/y**(a/b), (x, 0, oo)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
oo \n\ |
|
|
____ \n\ |
|
|
\\ ` \n\ |
|
|
\\ -a \n\ |
|
|
\\ ---\n\ |
|
|
/ b \n\ |
|
|
/ y \n\ |
|
|
/___, \n\ |
|
|
x = 0 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
∞ \n\ |
|
|
____ \n\ |
|
|
╲ \n\ |
|
|
╲ -a \n\ |
|
|
╲ ───\n\ |
|
|
╱ b \n\ |
|
|
╱ y \n\ |
|
|
╱ \n\ |
|
|
‾‾‾‾ \n\ |
|
|
x = 0 \ |
|
|
""" |
|
|
|
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Sum(1/y**(a/b), (x, 0, oo), (y, 1, 2)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2 oo \n\ |
|
|
____ ____ \n\ |
|
|
\\ ` \\ ` \n\ |
|
|
\\ \\ -a\n\ |
|
|
\\ \\ --\n\ |
|
|
/ / b \n\ |
|
|
/ / y \n\ |
|
|
/___, /___, \n\ |
|
|
y = 1 x = 0 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
2 ∞ \n\ |
|
|
____ ____ \n\ |
|
|
╲ ╲ \n\ |
|
|
╲ ╲ -a\n\ |
|
|
╲ ╲ ──\n\ |
|
|
╱ ╱ b \n\ |
|
|
╱ ╱ y \n\ |
|
|
╱ ╱ \n\ |
|
|
‾‾‾‾ ‾‾‾‾ \n\ |
|
|
y = 1 x = 0 \ |
|
|
""" |
|
|
expr = Sum(1/(1 + 1/( |
|
|
1 + 1/k)) + 1, (k, 111, 1 + 1/n), (k, 1/(1 + m), oo)) + 1/(1 + 1/k) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
1 \n\ |
|
|
1 + - \n\ |
|
|
oo n \n\ |
|
|
_____ _____ \n\ |
|
|
\\ ` \\ ` \n\ |
|
|
\\ \\ / 1 \\ \n\ |
|
|
\\ \\ |1 + ---------| \n\ |
|
|
\\ \\ | 1 | 1 \n\ |
|
|
) ) | 1 + -----| + -----\n\ |
|
|
/ / | 1| 1\n\ |
|
|
/ / | 1 + -| 1 + -\n\ |
|
|
/ / \\ k/ k\n\ |
|
|
/____, /____, \n\ |
|
|
1 k = 111 \n\ |
|
|
k = ----- \n\ |
|
|
m + 1 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
1 \n\ |
|
|
1 + ─ \n\ |
|
|
∞ n \n\ |
|
|
______ ______ \n\ |
|
|
╲ ╲ \n\ |
|
|
╲ ╲ \n\ |
|
|
╲ ╲ ⎛ 1 ⎞ \n\ |
|
|
╲ ╲ ⎜1 + ─────────⎟ \n\ |
|
|
╲ ╲ ⎜ 1 ⎟ 1 \n\ |
|
|
╱ ╱ ⎜ 1 + ─────⎟ + ─────\n\ |
|
|
╱ ╱ ⎜ 1⎟ 1\n\ |
|
|
╱ ╱ ⎜ 1 + ─⎟ 1 + ─\n\ |
|
|
╱ ╱ ⎝ k⎠ k\n\ |
|
|
╱ ╱ \n\ |
|
|
‾‾‾‾‾‾ ‾‾‾‾‾‾ \n\ |
|
|
1 k = 111 \n\ |
|
|
k = ───── \n\ |
|
|
m + 1 \ |
|
|
""" |
|
|
|
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_units(): |
|
|
expr = joule |
|
|
ascii_str1 = \ |
|
|
"""\ |
|
|
2\n\ |
|
|
kilogram*meter \n\ |
|
|
---------------\n\ |
|
|
2 \n\ |
|
|
second \ |
|
|
""" |
|
|
unicode_str1 = \ |
|
|
"""\ |
|
|
2\n\ |
|
|
kilogram⋅meter \n\ |
|
|
───────────────\n\ |
|
|
2 \n\ |
|
|
second \ |
|
|
""" |
|
|
|
|
|
ascii_str2 = \ |
|
|
"""\ |
|
|
2\n\ |
|
|
3*x*y*kilogram*meter \n\ |
|
|
---------------------\n\ |
|
|
2 \n\ |
|
|
second \ |
|
|
""" |
|
|
unicode_str2 = \ |
|
|
"""\ |
|
|
2\n\ |
|
|
3⋅x⋅y⋅kilogram⋅meter \n\ |
|
|
─────────────────────\n\ |
|
|
2 \n\ |
|
|
second \ |
|
|
""" |
|
|
|
|
|
from sympy.physics.units import kg, m, s |
|
|
assert upretty(expr) == "joule" |
|
|
assert pretty(expr) == "joule" |
|
|
assert upretty(expr.convert_to(kg*m**2/s**2)) == unicode_str1 |
|
|
assert pretty(expr.convert_to(kg*m**2/s**2)) == ascii_str1 |
|
|
assert upretty(3*kg*x*m**2*y/s**2) == unicode_str2 |
|
|
assert pretty(3*kg*x*m**2*y/s**2) == ascii_str2 |
|
|
|
|
|
|
|
|
def test_pretty_Subs(): |
|
|
f = Function('f') |
|
|
expr = Subs(f(x), x, ph**2) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
(f(x))| 2\n\ |
|
|
|x=phi \ |
|
|
""" |
|
|
unicode_str = \ |
|
|
"""\ |
|
|
(f(x))│ 2\n\ |
|
|
│x=φ \ |
|
|
""" |
|
|
|
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == unicode_str |
|
|
|
|
|
expr = Subs(f(x).diff(x), x, 0) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/d \\| \n\ |
|
|
|--(f(x))|| \n\ |
|
|
\\dx /|x=0\ |
|
|
""" |
|
|
unicode_str = \ |
|
|
"""\ |
|
|
⎛d ⎞│ \n\ |
|
|
⎜──(f(x))⎟│ \n\ |
|
|
⎝dx ⎠│x=0\ |
|
|
""" |
|
|
|
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == unicode_str |
|
|
|
|
|
expr = Subs(f(x).diff(x)/y, (x, y), (0, Rational(1, 2))) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/d \\| \n\ |
|
|
|--(f(x))|| \n\ |
|
|
|dx || \n\ |
|
|
|--------|| \n\ |
|
|
\\ y /|x=0, y=1/2\ |
|
|
""" |
|
|
unicode_str = \ |
|
|
"""\ |
|
|
⎛d ⎞│ \n\ |
|
|
⎜──(f(x))⎟│ \n\ |
|
|
⎜dx ⎟│ \n\ |
|
|
⎜────────⎟│ \n\ |
|
|
⎝ y ⎠│x=0, y=1/2\ |
|
|
""" |
|
|
|
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == unicode_str |
|
|
|
|
|
|
|
|
def test_gammas(): |
|
|
assert upretty(lowergamma(x, y)) == "γ(x, y)" |
|
|
assert upretty(uppergamma(x, y)) == "Γ(x, y)" |
|
|
assert xpretty(gamma(x), use_unicode=True) == 'Γ(x)' |
|
|
assert xpretty(gamma, use_unicode=True) == 'Γ' |
|
|
assert xpretty(symbols('gamma', cls=Function)(x), use_unicode=True) == 'γ(x)' |
|
|
assert xpretty(symbols('gamma', cls=Function), use_unicode=True) == 'γ' |
|
|
|
|
|
|
|
|
def test_beta(): |
|
|
assert xpretty(beta(x,y), use_unicode=True) == 'Β(x, y)' |
|
|
assert xpretty(beta(x,y), use_unicode=False) == 'B(x, y)' |
|
|
assert xpretty(beta, use_unicode=True) == 'Β' |
|
|
assert xpretty(beta, use_unicode=False) == 'B' |
|
|
mybeta = Function('beta') |
|
|
assert xpretty(mybeta(x), use_unicode=True) == 'β(x)' |
|
|
assert xpretty(mybeta(x, y, z), use_unicode=False) == 'beta(x, y, z)' |
|
|
assert xpretty(mybeta, use_unicode=True) == 'β' |
|
|
|
|
|
|
|
|
|
|
|
def test_function_subclass_different_name(): |
|
|
class mygamma(gamma): |
|
|
pass |
|
|
assert xpretty(mygamma, use_unicode=True) == r"mygamma" |
|
|
assert xpretty(mygamma(x), use_unicode=True) == r"mygamma(x)" |
|
|
|
|
|
|
|
|
def test_SingularityFunction(): |
|
|
assert xpretty(SingularityFunction(x, 0, n), use_unicode=True) == ( |
|
|
"""\ |
|
|
n\n\ |
|
|
<x> \ |
|
|
""") |
|
|
assert xpretty(SingularityFunction(x, 1, n), use_unicode=True) == ( |
|
|
"""\ |
|
|
n\n\ |
|
|
<x - 1> \ |
|
|
""") |
|
|
assert xpretty(SingularityFunction(x, -1, n), use_unicode=True) == ( |
|
|
"""\ |
|
|
n\n\ |
|
|
<x + 1> \ |
|
|
""") |
|
|
assert xpretty(SingularityFunction(x, a, n), use_unicode=True) == ( |
|
|
"""\ |
|
|
n\n\ |
|
|
<-a + x> \ |
|
|
""") |
|
|
assert xpretty(SingularityFunction(x, y, n), use_unicode=True) == ( |
|
|
"""\ |
|
|
n\n\ |
|
|
<x - y> \ |
|
|
""") |
|
|
assert xpretty(SingularityFunction(x, 0, n), use_unicode=False) == ( |
|
|
"""\ |
|
|
n\n\ |
|
|
<x> \ |
|
|
""") |
|
|
assert xpretty(SingularityFunction(x, 1, n), use_unicode=False) == ( |
|
|
"""\ |
|
|
n\n\ |
|
|
<x - 1> \ |
|
|
""") |
|
|
assert xpretty(SingularityFunction(x, -1, n), use_unicode=False) == ( |
|
|
"""\ |
|
|
n\n\ |
|
|
<x + 1> \ |
|
|
""") |
|
|
assert xpretty(SingularityFunction(x, a, n), use_unicode=False) == ( |
|
|
"""\ |
|
|
n\n\ |
|
|
<-a + x> \ |
|
|
""") |
|
|
assert xpretty(SingularityFunction(x, y, n), use_unicode=False) == ( |
|
|
"""\ |
|
|
n\n\ |
|
|
<x - y> \ |
|
|
""") |
|
|
|
|
|
|
|
|
def test_deltas(): |
|
|
assert xpretty(DiracDelta(x), use_unicode=True) == 'δ(x)' |
|
|
assert xpretty(DiracDelta(x, 1), use_unicode=True) == \ |
|
|
"""\ |
|
|
(1) \n\ |
|
|
δ (x)\ |
|
|
""" |
|
|
assert xpretty(x*DiracDelta(x, 1), use_unicode=True) == \ |
|
|
"""\ |
|
|
(1) \n\ |
|
|
x⋅δ (x)\ |
|
|
""" |
|
|
|
|
|
|
|
|
def test_hyper(): |
|
|
expr = hyper((), (), z) |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
┌─ ⎛ │ ⎞\n\ |
|
|
├─ ⎜ │ z⎟\n\ |
|
|
0╵ 0 ⎝ │ ⎠\ |
|
|
""" |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
_ \n\ |
|
|
|_ / | \\\n\ |
|
|
| | | z|\n\ |
|
|
0 0 \\ | /\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = hyper((), (1,), x) |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
┌─ ⎛ │ ⎞\n\ |
|
|
├─ ⎜ │ x⎟\n\ |
|
|
0╵ 1 ⎝1 │ ⎠\ |
|
|
""" |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
_ \n\ |
|
|
|_ / | \\\n\ |
|
|
| | | x|\n\ |
|
|
0 1 \\1 | /\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = hyper([2], [1], x) |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
┌─ ⎛2 │ ⎞\n\ |
|
|
├─ ⎜ │ x⎟\n\ |
|
|
1╵ 1 ⎝1 │ ⎠\ |
|
|
""" |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
_ \n\ |
|
|
|_ /2 | \\\n\ |
|
|
| | | x|\n\ |
|
|
1 1 \\1 | /\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = hyper((pi/3, -2*k), (3, 4, 5, -3), x) |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛ π │ ⎞\n\ |
|
|
┌─ ⎜ ─, -2⋅k │ ⎟\n\ |
|
|
├─ ⎜ 3 │ x⎟\n\ |
|
|
2╵ 4 ⎜ │ ⎟\n\ |
|
|
⎝-3, 3, 4, 5 │ ⎠\ |
|
|
""" |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
\n\ |
|
|
_ / pi | \\\n\ |
|
|
|_ | --, -2*k | |\n\ |
|
|
| | 3 | x|\n\ |
|
|
2 4 | | |\n\ |
|
|
\\-3, 3, 4, 5 | /\ |
|
|
""" |
|
|
|
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = hyper((pi, S('2/3'), -2*k), (3, 4, 5, -3), x**2) |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
┌─ ⎛2/3, π, -2⋅k │ 2⎞\n\ |
|
|
├─ ⎜ │ x ⎟\n\ |
|
|
3╵ 4 ⎝-3, 3, 4, 5 │ ⎠\ |
|
|
""" |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
_ \n\ |
|
|
|_ /2/3, pi, -2*k | 2\\ |
|
|
| | | x | |
|
|
3 4 \\ -3, 3, 4, 5 | /""" |
|
|
|
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = hyper([1, 2], [3, 4], 1/(1/(1/(1/x + 1) + 1) + 1)) |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛ │ 1 ⎞\n\ |
|
|
⎜ │ ─────────────⎟\n\ |
|
|
⎜ │ 1 ⎟\n\ |
|
|
┌─ ⎜1, 2 │ 1 + ─────────⎟\n\ |
|
|
├─ ⎜ │ 1 ⎟\n\ |
|
|
2╵ 2 ⎜3, 4 │ 1 + ─────⎟\n\ |
|
|
⎜ │ 1⎟\n\ |
|
|
⎜ │ 1 + ─⎟\n\ |
|
|
⎝ │ x⎠\ |
|
|
""" |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
\n\ |
|
|
/ | 1 \\\n\ |
|
|
| | -------------|\n\ |
|
|
_ | | 1 |\n\ |
|
|
|_ |1, 2 | 1 + ---------|\n\ |
|
|
| | | 1 |\n\ |
|
|
2 2 |3, 4 | 1 + -----|\n\ |
|
|
| | 1|\n\ |
|
|
| | 1 + -|\n\ |
|
|
\\ | x/\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_meijerg(): |
|
|
expr = meijerg([pi, pi, x], [1], [0, 1], [1, 2, 3], z) |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
╭─╮2, 3 ⎛π, π, x 1 │ ⎞\n\ |
|
|
│╶┐ ⎜ │ z⎟\n\ |
|
|
╰─╯4, 5 ⎝ 0, 1 1, 2, 3 │ ⎠\ |
|
|
""" |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
__2, 3 /pi, pi, x 1 | \\\n\ |
|
|
/__ | | z|\n\ |
|
|
\\_|4, 5 \\ 0, 1 1, 2, 3 | /\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = meijerg([1, pi/7], [2, pi, 5], [], [], z**2) |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛ π │ ⎞\n\ |
|
|
╭─╮0, 2 ⎜1, ─ 2, 5, π │ 2⎟\n\ |
|
|
│╶┐ ⎜ 7 │ z ⎟\n\ |
|
|
╰─╯5, 0 ⎜ │ ⎟\n\ |
|
|
⎝ │ ⎠\ |
|
|
""" |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ pi | \\\n\ |
|
|
__0, 2 |1, -- 2, 5, pi | 2|\n\ |
|
|
/__ | 7 | z |\n\ |
|
|
\\_|5, 0 | | |\n\ |
|
|
\\ | /\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
ucode_str = \ |
|
|
"""\ |
|
|
╭─╮ 1, 10 ⎛1, 1, 1, 1, 1, 1, 1, 1, 1, 1 1 │ ⎞\n\ |
|
|
│╶┐ ⎜ │ z⎟\n\ |
|
|
╰─╯11, 2 ⎝ 1 1 │ ⎠\ |
|
|
""" |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
__ 1, 10 /1, 1, 1, 1, 1, 1, 1, 1, 1, 1 1 | \\\n\ |
|
|
/__ | | z|\n\ |
|
|
\\_|11, 2 \\ 1 1 | /\ |
|
|
""" |
|
|
|
|
|
expr = meijerg([1]*10, [1], [1], [1], z) |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = meijerg([1, 2, ], [4, 3], [3], [4, 5], 1/(1/(1/(1/x + 1) + 1) + 1)) |
|
|
|
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛ │ 1 ⎞\n\ |
|
|
⎜ │ ─────────────⎟\n\ |
|
|
⎜ │ 1 ⎟\n\ |
|
|
╭─╮1, 2 ⎜1, 2 3, 4 │ 1 + ─────────⎟\n\ |
|
|
│╶┐ ⎜ │ 1 ⎟\n\ |
|
|
╰─╯4, 3 ⎜ 3 4, 5 │ 1 + ─────⎟\n\ |
|
|
⎜ │ 1⎟\n\ |
|
|
⎜ │ 1 + ─⎟\n\ |
|
|
⎝ │ x⎠\ |
|
|
""" |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ | 1 \\\n\ |
|
|
| | -------------|\n\ |
|
|
| | 1 |\n\ |
|
|
__1, 2 |1, 2 3, 4 | 1 + ---------|\n\ |
|
|
/__ | | 1 |\n\ |
|
|
\\_|4, 3 | 3 4, 5 | 1 + -----|\n\ |
|
|
| | 1|\n\ |
|
|
| | 1 + -|\n\ |
|
|
\\ | x/\ |
|
|
""" |
|
|
|
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = Integral(expr, x) |
|
|
|
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⌠ \n\ |
|
|
⎮ ⎛ │ 1 ⎞ \n\ |
|
|
⎮ ⎜ │ ─────────────⎟ \n\ |
|
|
⎮ ⎜ │ 1 ⎟ \n\ |
|
|
⎮ ╭─╮1, 2 ⎜1, 2 3, 4 │ 1 + ─────────⎟ \n\ |
|
|
⎮ │╶┐ ⎜ │ 1 ⎟ dx\n\ |
|
|
⎮ ╰─╯4, 3 ⎜ 3 4, 5 │ 1 + ─────⎟ \n\ |
|
|
⎮ ⎜ │ 1⎟ \n\ |
|
|
⎮ ⎜ │ 1 + ─⎟ \n\ |
|
|
⎮ ⎝ │ x⎠ \n\ |
|
|
⌡ \ |
|
|
""" |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ \n\ |
|
|
| \n\ |
|
|
| / | 1 \\ \n\ |
|
|
| | | -------------| \n\ |
|
|
| | | 1 | \n\ |
|
|
| __1, 2 |1, 2 3, 4 | 1 + ---------| \n\ |
|
|
| /__ | | 1 | dx\n\ |
|
|
| \\_|4, 3 | 3 4, 5 | 1 + -----| \n\ |
|
|
| | | 1| \n\ |
|
|
| | | 1 + -| \n\ |
|
|
| \\ | x/ \n\ |
|
|
| \n\ |
|
|
/ \ |
|
|
""" |
|
|
|
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_noncommutative(): |
|
|
A, B, C = symbols('A,B,C', commutative=False) |
|
|
|
|
|
expr = A*B*C**-1 |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
-1\n\ |
|
|
A*B*C \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
-1\n\ |
|
|
A⋅B⋅C \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = C**-1*A*B |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
-1 \n\ |
|
|
C *A*B\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
-1 \n\ |
|
|
C ⋅A⋅B\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = A*C**-1*B |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
-1 \n\ |
|
|
A*C *B\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
-1 \n\ |
|
|
A⋅C ⋅B\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = A*C**-1*B/x |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
-1 \n\ |
|
|
A*C *B\n\ |
|
|
-------\n\ |
|
|
x \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
-1 \n\ |
|
|
A⋅C ⋅B\n\ |
|
|
───────\n\ |
|
|
x \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_pretty_special_functions(): |
|
|
x, y = symbols("x y") |
|
|
|
|
|
|
|
|
expr = atan2(y/sqrt(200), sqrt(x)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ ___ \\\n\ |
|
|
|\\/ 2 *y ___|\n\ |
|
|
atan2|-------, \\/ x |\n\ |
|
|
\\ 20 /\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛√2⋅y ⎞\n\ |
|
|
atan2⎜────, √x⎟\n\ |
|
|
⎝ 20 ⎠\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_pretty_geometry(): |
|
|
e = Segment((0, 1), (0, 2)) |
|
|
assert pretty(e) == 'Segment2D(Point2D(0, 1), Point2D(0, 2))' |
|
|
e = Ray((1, 1), angle=4.02*pi) |
|
|
assert pretty(e) == 'Ray2D(Point2D(1, 1), Point2D(2, tan(pi/50) + 1))' |
|
|
|
|
|
|
|
|
def test_expint(): |
|
|
expr = Ei(x) |
|
|
string = 'Ei(x)' |
|
|
assert pretty(expr) == string |
|
|
assert upretty(expr) == string |
|
|
|
|
|
expr = expint(1, z) |
|
|
ucode_str = "E₁(z)" |
|
|
ascii_str = "expint(1, z)" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
assert pretty(Shi(x)) == 'Shi(x)' |
|
|
assert pretty(Si(x)) == 'Si(x)' |
|
|
assert pretty(Ci(x)) == 'Ci(x)' |
|
|
assert pretty(Chi(x)) == 'Chi(x)' |
|
|
assert upretty(Shi(x)) == 'Shi(x)' |
|
|
assert upretty(Si(x)) == 'Si(x)' |
|
|
assert upretty(Ci(x)) == 'Ci(x)' |
|
|
assert upretty(Chi(x)) == 'Chi(x)' |
|
|
|
|
|
|
|
|
def test_elliptic_functions(): |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ 1 \\\n\ |
|
|
K|-----|\n\ |
|
|
\\z + 1/\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛ 1 ⎞\n\ |
|
|
K⎜─────⎟\n\ |
|
|
⎝z + 1⎠\ |
|
|
""" |
|
|
expr = elliptic_k(1/(z + 1)) |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ | 1 \\\n\ |
|
|
F|1|-----|\n\ |
|
|
\\ |z + 1/\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛ │ 1 ⎞\n\ |
|
|
F⎜1│─────⎟\n\ |
|
|
⎝ │z + 1⎠\ |
|
|
""" |
|
|
expr = elliptic_f(1, 1/(1 + z)) |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ 1 \\\n\ |
|
|
E|-----|\n\ |
|
|
\\z + 1/\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛ 1 ⎞\n\ |
|
|
E⎜─────⎟\n\ |
|
|
⎝z + 1⎠\ |
|
|
""" |
|
|
expr = elliptic_e(1/(z + 1)) |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ | 1 \\\n\ |
|
|
E|1|-----|\n\ |
|
|
\\ |z + 1/\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛ │ 1 ⎞\n\ |
|
|
E⎜1│─────⎟\n\ |
|
|
⎝ │z + 1⎠\ |
|
|
""" |
|
|
expr = elliptic_e(1, 1/(1 + z)) |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ |4\\\n\ |
|
|
Pi|3|-|\n\ |
|
|
\\ |x/\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛ │4⎞\n\ |
|
|
Π⎜3│─⎟\n\ |
|
|
⎝ │x⎠\ |
|
|
""" |
|
|
expr = elliptic_pi(3, 4/x) |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ 4| \\\n\ |
|
|
Pi|3; -|6|\n\ |
|
|
\\ x| /\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛ 4│ ⎞\n\ |
|
|
Π⎜3; ─│6⎟\n\ |
|
|
⎝ x│ ⎠\ |
|
|
""" |
|
|
expr = elliptic_pi(3, 4/x, 6) |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_RandomDomain(): |
|
|
from sympy.stats import Normal, Die, Exponential, pspace, where |
|
|
X = Normal('x1', 0, 1) |
|
|
assert upretty(where(X > 0)) == "Domain: 0 < x₁ ∧ x₁ < ∞" |
|
|
|
|
|
D = Die('d1', 6) |
|
|
assert upretty(where(D > 4)) == 'Domain: d₁ = 5 ∨ d₁ = 6' |
|
|
|
|
|
A = Exponential('a', 1) |
|
|
B = Exponential('b', 1) |
|
|
assert upretty(pspace(Tuple(A, B)).domain) == \ |
|
|
'Domain: 0 ≤ a ∧ 0 ≤ b ∧ a < ∞ ∧ b < ∞' |
|
|
|
|
|
|
|
|
def test_PrettyPoly(): |
|
|
F = QQ.frac_field(x, y) |
|
|
R = QQ.poly_ring(x, y) |
|
|
|
|
|
expr = F.convert(x/(x + y)) |
|
|
assert pretty(expr) == "x/(x + y)" |
|
|
assert upretty(expr) == "x/(x + y)" |
|
|
|
|
|
expr = R.convert(x + y) |
|
|
assert pretty(expr) == "x + y" |
|
|
assert upretty(expr) == "x + y" |
|
|
|
|
|
|
|
|
def test_issue_6285(): |
|
|
assert pretty(Pow(2, -5, evaluate=False)) == '1 \n--\n 5\n2 ' |
|
|
assert pretty(Pow(x, (1/pi))) == \ |
|
|
' 1 \n'\ |
|
|
' --\n'\ |
|
|
' pi\n'\ |
|
|
'x ' |
|
|
|
|
|
|
|
|
def test_issue_6359(): |
|
|
assert pretty(Integral(x**2, x)**2) == \ |
|
|
"""\ |
|
|
2 |
|
|
/ / \\ \n\ |
|
|
| | | \n\ |
|
|
| | 2 | \n\ |
|
|
| | x dx| \n\ |
|
|
| | | \n\ |
|
|
\\/ / \ |
|
|
""" |
|
|
assert upretty(Integral(x**2, x)**2) == \ |
|
|
"""\ |
|
|
2 |
|
|
⎛⌠ ⎞ \n\ |
|
|
⎜⎮ 2 ⎟ \n\ |
|
|
⎜⎮ x dx⎟ \n\ |
|
|
⎝⌡ ⎠ \ |
|
|
""" |
|
|
|
|
|
assert pretty(Sum(x**2, (x, 0, 1))**2) == \ |
|
|
"""\ |
|
|
2\n\ |
|
|
/ 1 \\ \n\ |
|
|
|___ | \n\ |
|
|
|\\ ` | \n\ |
|
|
| \\ 2| \n\ |
|
|
| / x | \n\ |
|
|
|/__, | \n\ |
|
|
\\x = 0 / \ |
|
|
""" |
|
|
assert upretty(Sum(x**2, (x, 0, 1))**2) == \ |
|
|
"""\ |
|
|
2 |
|
|
⎛ 1 ⎞ \n\ |
|
|
⎜ ___ ⎟ \n\ |
|
|
⎜ ╲ ⎟ \n\ |
|
|
⎜ ╲ 2⎟ \n\ |
|
|
⎜ ╱ x ⎟ \n\ |
|
|
⎜ ╱ ⎟ \n\ |
|
|
⎜ ‾‾‾ ⎟ \n\ |
|
|
⎝x = 0 ⎠ \ |
|
|
""" |
|
|
|
|
|
assert pretty(Product(x**2, (x, 1, 2))**2) == \ |
|
|
"""\ |
|
|
2 |
|
|
/ 2 \\ \n\ |
|
|
|______ | \n\ |
|
|
| | | 2| \n\ |
|
|
| | | x | \n\ |
|
|
| | | | \n\ |
|
|
\\x = 1 / \ |
|
|
""" |
|
|
assert upretty(Product(x**2, (x, 1, 2))**2) == \ |
|
|
"""\ |
|
|
2 |
|
|
⎛ 2 ⎞ \n\ |
|
|
⎜─┬──┬─ ⎟ \n\ |
|
|
⎜ │ │ 2⎟ \n\ |
|
|
⎜ │ │ x ⎟ \n\ |
|
|
⎜ │ │ ⎟ \n\ |
|
|
⎝x = 1 ⎠ \ |
|
|
""" |
|
|
|
|
|
f = Function('f') |
|
|
assert pretty(Derivative(f(x), x)**2) == \ |
|
|
"""\ |
|
|
2 |
|
|
/d \\ \n\ |
|
|
|--(f(x))| \n\ |
|
|
\\dx / \ |
|
|
""" |
|
|
assert upretty(Derivative(f(x), x)**2) == \ |
|
|
"""\ |
|
|
2 |
|
|
⎛d ⎞ \n\ |
|
|
⎜──(f(x))⎟ \n\ |
|
|
⎝dx ⎠ \ |
|
|
""" |
|
|
|
|
|
|
|
|
def test_issue_6739(): |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
1 \n\ |
|
|
-----\n\ |
|
|
___\n\ |
|
|
\\/ x \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
1 \n\ |
|
|
──\n\ |
|
|
√x\ |
|
|
""" |
|
|
assert pretty(1/sqrt(x)) == ascii_str |
|
|
assert upretty(1/sqrt(x)) == ucode_str |
|
|
|
|
|
|
|
|
def test_complicated_symbol_unchanged(): |
|
|
for symb_name in ["dexpr2_d1tau", "dexpr2^d1tau"]: |
|
|
assert pretty(Symbol(symb_name)) == symb_name |
|
|
|
|
|
|
|
|
def test_categories(): |
|
|
from sympy.categories import (Object, IdentityMorphism, |
|
|
NamedMorphism, Category, Diagram, DiagramGrid) |
|
|
|
|
|
A1 = Object("A1") |
|
|
A2 = Object("A2") |
|
|
A3 = Object("A3") |
|
|
|
|
|
f1 = NamedMorphism(A1, A2, "f1") |
|
|
f2 = NamedMorphism(A2, A3, "f2") |
|
|
id_A1 = IdentityMorphism(A1) |
|
|
|
|
|
K1 = Category("K1") |
|
|
|
|
|
assert pretty(A1) == "A1" |
|
|
assert upretty(A1) == "A₁" |
|
|
|
|
|
assert pretty(f1) == "f1:A1-->A2" |
|
|
assert upretty(f1) == "f₁:A₁——▶A₂" |
|
|
assert pretty(id_A1) == "id:A1-->A1" |
|
|
assert upretty(id_A1) == "id:A₁——▶A₁" |
|
|
|
|
|
assert pretty(f2*f1) == "f2*f1:A1-->A3" |
|
|
assert upretty(f2*f1) == "f₂∘f₁:A₁——▶A₃" |
|
|
|
|
|
assert pretty(K1) == "K1" |
|
|
assert upretty(K1) == "K₁" |
|
|
|
|
|
|
|
|
d = Diagram() |
|
|
assert pretty(d) == "EmptySet" |
|
|
assert upretty(d) == "∅" |
|
|
|
|
|
d = Diagram({f1: "unique", f2: S.EmptySet}) |
|
|
assert pretty(d) == "{f2*f1:A1-->A3: EmptySet, id:A1-->A1: " \ |
|
|
"EmptySet, id:A2-->A2: EmptySet, id:A3-->A3: " \ |
|
|
"EmptySet, f1:A1-->A2: {unique}, f2:A2-->A3: EmptySet}" |
|
|
|
|
|
assert upretty(d) == "{f₂∘f₁:A₁——▶A₃: ∅, id:A₁——▶A₁: ∅, " \ |
|
|
"id:A₂——▶A₂: ∅, id:A₃——▶A₃: ∅, f₁:A₁——▶A₂: {unique}, f₂:A₂——▶A₃: ∅}" |
|
|
|
|
|
d = Diagram({f1: "unique", f2: S.EmptySet}, {f2 * f1: "unique"}) |
|
|
assert pretty(d) == "{f2*f1:A1-->A3: EmptySet, id:A1-->A1: " \ |
|
|
"EmptySet, id:A2-->A2: EmptySet, id:A3-->A3: " \ |
|
|
"EmptySet, f1:A1-->A2: {unique}, f2:A2-->A3: EmptySet}" \ |
|
|
" ==> {f2*f1:A1-->A3: {unique}}" |
|
|
assert upretty(d) == "{f₂∘f₁:A₁——▶A₃: ∅, id:A₁——▶A₁: ∅, id:A₂——▶A₂: " \ |
|
|
"∅, id:A₃——▶A₃: ∅, f₁:A₁——▶A₂: {unique}, f₂:A₂——▶A₃: ∅}" \ |
|
|
" ══▶ {f₂∘f₁:A₁——▶A₃: {unique}}" |
|
|
|
|
|
grid = DiagramGrid(d) |
|
|
assert pretty(grid) == "A1 A2\n \nA3 " |
|
|
assert upretty(grid) == "A₁ A₂\n \nA₃ " |
|
|
|
|
|
|
|
|
def test_PrettyModules(): |
|
|
R = QQ.old_poly_ring(x, y) |
|
|
F = R.free_module(2) |
|
|
M = F.submodule([x, y], [1, x**2]) |
|
|
|
|
|
ucode_str = \ |
|
|
"""\ |
|
|
2\n\ |
|
|
ℚ[x, y] \ |
|
|
""" |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2\n\ |
|
|
QQ[x, y] \ |
|
|
""" |
|
|
|
|
|
assert upretty(F) == ucode_str |
|
|
assert pretty(F) == ascii_str |
|
|
|
|
|
ucode_str = \ |
|
|
"""\ |
|
|
╱ ⎡ 2⎤╲\n\ |
|
|
╲[x, y], ⎣1, x ⎦╱\ |
|
|
""" |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
<[x, y], [1, x ]>\ |
|
|
""" |
|
|
|
|
|
assert upretty(M) == ucode_str |
|
|
assert pretty(M) == ascii_str |
|
|
|
|
|
I = R.ideal(x**2, y) |
|
|
|
|
|
ucode_str = \ |
|
|
"""\ |
|
|
╱ 2 ╲\n\ |
|
|
╲x , y╱\ |
|
|
""" |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
<x , y>\ |
|
|
""" |
|
|
|
|
|
assert upretty(I) == ucode_str |
|
|
assert pretty(I) == ascii_str |
|
|
|
|
|
Q = F / M |
|
|
|
|
|
ucode_str = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
ℚ[x, y] \n\ |
|
|
─────────────────\n\ |
|
|
╱ ⎡ 2⎤╲\n\ |
|
|
╲[x, y], ⎣1, x ⎦╱\ |
|
|
""" |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
QQ[x, y] \n\ |
|
|
-----------------\n\ |
|
|
2 \n\ |
|
|
<[x, y], [1, x ]>\ |
|
|
""" |
|
|
|
|
|
assert upretty(Q) == ucode_str |
|
|
assert pretty(Q) == ascii_str |
|
|
|
|
|
ucode_str = \ |
|
|
"""\ |
|
|
╱⎡ 3⎤ ╲\n\ |
|
|
│⎢ x ⎥ ╱ ⎡ 2⎤╲ ╱ ⎡ 2⎤╲│\n\ |
|
|
│⎢1, ──⎥ + ╲[x, y], ⎣1, x ⎦╱, [2, y] + ╲[x, y], ⎣1, x ⎦╱│\n\ |
|
|
╲⎣ 2 ⎦ ╱\ |
|
|
""" |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
3 \n\ |
|
|
x 2 2 \n\ |
|
|
<[1, --] + <[x, y], [1, x ]>, [2, y] + <[x, y], [1, x ]>>\n\ |
|
|
2 \ |
|
|
""" |
|
|
|
|
|
|
|
|
def test_QuotientRing(): |
|
|
R = QQ.old_poly_ring(x)/[x**2 + 1] |
|
|
|
|
|
ucode_str = \ |
|
|
"""\ |
|
|
ℚ[x] \n\ |
|
|
────────\n\ |
|
|
╱ 2 ╲\n\ |
|
|
╲x + 1╱\ |
|
|
""" |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
QQ[x] \n\ |
|
|
--------\n\ |
|
|
2 \n\ |
|
|
<x + 1>\ |
|
|
""" |
|
|
|
|
|
assert upretty(R) == ucode_str |
|
|
assert pretty(R) == ascii_str |
|
|
|
|
|
ucode_str = \ |
|
|
"""\ |
|
|
╱ 2 ╲\n\ |
|
|
1 + ╲x + 1╱\ |
|
|
""" |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
1 + <x + 1>\ |
|
|
""" |
|
|
|
|
|
assert upretty(R.one) == ucode_str |
|
|
assert pretty(R.one) == ascii_str |
|
|
|
|
|
|
|
|
def test_Homomorphism(): |
|
|
from sympy.polys.agca import homomorphism |
|
|
|
|
|
R = QQ.old_poly_ring(x) |
|
|
|
|
|
expr = homomorphism(R.free_module(1), R.free_module(1), [0]) |
|
|
|
|
|
ucode_str = \ |
|
|
"""\ |
|
|
1 1\n\ |
|
|
[0] : ℚ[x] ──> ℚ[x] \ |
|
|
""" |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
1 1\n\ |
|
|
[0] : QQ[x] --> QQ[x] \ |
|
|
""" |
|
|
|
|
|
assert upretty(expr) == ucode_str |
|
|
assert pretty(expr) == ascii_str |
|
|
|
|
|
expr = homomorphism(R.free_module(2), R.free_module(2), [0, 0]) |
|
|
|
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎡0 0⎤ 2 2\n\ |
|
|
⎢ ⎥ : ℚ[x] ──> ℚ[x] \n\ |
|
|
⎣0 0⎦ \ |
|
|
""" |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
[0 0] 2 2\n\ |
|
|
[ ] : QQ[x] --> QQ[x] \n\ |
|
|
[0 0] \ |
|
|
""" |
|
|
|
|
|
assert upretty(expr) == ucode_str |
|
|
assert pretty(expr) == ascii_str |
|
|
|
|
|
expr = homomorphism(R.free_module(1), R.free_module(1) / [[x]], [0]) |
|
|
|
|
|
ucode_str = \ |
|
|
"""\ |
|
|
1\n\ |
|
|
1 ℚ[x] \n\ |
|
|
[0] : ℚ[x] ──> ─────\n\ |
|
|
<[x]>\ |
|
|
""" |
|
|
|
|
|
ascii_str = \ |
|
|
"""\ |
|
|
1\n\ |
|
|
1 QQ[x] \n\ |
|
|
[0] : QQ[x] --> ------\n\ |
|
|
<[x]> \ |
|
|
""" |
|
|
|
|
|
assert upretty(expr) == ucode_str |
|
|
assert pretty(expr) == ascii_str |
|
|
|
|
|
|
|
|
def test_Tr(): |
|
|
A, B = symbols('A B', commutative=False) |
|
|
t = Tr(A*B) |
|
|
assert pretty(t) == r'Tr(A*B)' |
|
|
assert upretty(t) == 'Tr(A⋅B)' |
|
|
|
|
|
|
|
|
def test_pretty_Add(): |
|
|
eq = Mul(-2, x - 2, evaluate=False) + 5 |
|
|
assert pretty(eq) == '5 - 2*(x - 2)' |
|
|
|
|
|
|
|
|
def test_issue_7179(): |
|
|
assert upretty(Not(Equivalent(x, y))) == 'x ⇎ y' |
|
|
assert upretty(Not(Implies(x, y))) == 'x ↛ y' |
|
|
|
|
|
|
|
|
def test_issue_7180(): |
|
|
assert upretty(Equivalent(x, y)) == 'x ⇔ y' |
|
|
|
|
|
|
|
|
def test_pretty_Complement(): |
|
|
assert pretty(S.Reals - S.Naturals) == '(-oo, oo) \\ Naturals' |
|
|
assert upretty(S.Reals - S.Naturals) == 'ℝ \\ ℕ' |
|
|
assert pretty(S.Reals - S.Naturals0) == '(-oo, oo) \\ Naturals0' |
|
|
assert upretty(S.Reals - S.Naturals0) == 'ℝ \\ ℕ₀' |
|
|
|
|
|
|
|
|
def test_pretty_SymmetricDifference(): |
|
|
from sympy.sets.sets import SymmetricDifference |
|
|
assert upretty(SymmetricDifference(Interval(2,3), Interval(3,5), \ |
|
|
evaluate = False)) == '[2, 3] ∆ [3, 5]' |
|
|
with raises(NotImplementedError): |
|
|
pretty(SymmetricDifference(Interval(2,3), Interval(3,5), evaluate = False)) |
|
|
|
|
|
|
|
|
def test_pretty_Contains(): |
|
|
assert pretty(Contains(x, S.Integers)) == 'Contains(x, Integers)' |
|
|
assert upretty(Contains(x, S.Integers)) == 'x ∈ ℤ' |
|
|
|
|
|
|
|
|
def test_issue_8292(): |
|
|
from sympy.core import sympify |
|
|
e = sympify('((x+x**4)/(x-1))-(2*(x-1)**4/(x-1)**4)', evaluate=False) |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
4 4 \n\ |
|
|
2⋅(x - 1) x + x\n\ |
|
|
- ────────── + ──────\n\ |
|
|
4 x - 1 \n\ |
|
|
(x - 1) \ |
|
|
""" |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
4 4 \n\ |
|
|
2*(x - 1) x + x\n\ |
|
|
- ---------- + ------\n\ |
|
|
4 x - 1 \n\ |
|
|
(x - 1) \ |
|
|
""" |
|
|
assert pretty(e) == ascii_str |
|
|
assert upretty(e) == ucode_str |
|
|
|
|
|
|
|
|
def test_issue_4335(): |
|
|
y = Function('y') |
|
|
expr = -y(x).diff(x) |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
d \n\ |
|
|
-──(y(x))\n\ |
|
|
dx \ |
|
|
""" |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
d \n\ |
|
|
- --(y(x))\n\ |
|
|
dx \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_issue_8344(): |
|
|
from sympy.core import sympify |
|
|
e = sympify('2*x*y**2/1**2 + 1', evaluate=False) |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
2⋅x⋅y \n\ |
|
|
────── + 1\n\ |
|
|
2 \n\ |
|
|
1 \ |
|
|
""" |
|
|
assert upretty(e) == ucode_str |
|
|
|
|
|
|
|
|
def test_issue_6324(): |
|
|
x = Pow(2, 3, evaluate=False) |
|
|
y = Pow(10, -2, evaluate=False) |
|
|
e = Mul(x, y, evaluate=False) |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
3 \n\ |
|
|
2 \n\ |
|
|
───\n\ |
|
|
2\n\ |
|
|
10 \ |
|
|
""" |
|
|
assert upretty(e) == ucode_str |
|
|
|
|
|
|
|
|
def test_issue_7927(): |
|
|
e = sin(x/2)**cos(x/2) |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛x⎞\n\ |
|
|
cos⎜─⎟\n\ |
|
|
⎝2⎠\n\ |
|
|
⎛ ⎛x⎞⎞ \n\ |
|
|
⎜sin⎜─⎟⎟ \n\ |
|
|
⎝ ⎝2⎠⎠ \ |
|
|
""" |
|
|
assert upretty(e) == ucode_str |
|
|
e = sin(x)**(S(11)/13) |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
11\n\ |
|
|
──\n\ |
|
|
13\n\ |
|
|
(sin(x)) \ |
|
|
""" |
|
|
assert upretty(e) == ucode_str |
|
|
|
|
|
|
|
|
def test_issue_6134(): |
|
|
from sympy.abc import lamda, t |
|
|
phi = Function('phi') |
|
|
|
|
|
e = lamda*x*Integral(phi(t)*pi*sin(pi*t), (t, 0, 1)) + lamda*x**2*Integral(phi(t)*2*pi*sin(2*pi*t), (t, 0, 1)) |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
1 1 \n\ |
|
|
2 ⌠ ⌠ \n\ |
|
|
λ⋅x ⋅⎮ 2⋅π⋅φ(t)⋅sin(2⋅π⋅t) dt + λ⋅x⋅⎮ π⋅φ(t)⋅sin(π⋅t) dt\n\ |
|
|
⌡ ⌡ \n\ |
|
|
0 0 \ |
|
|
""" |
|
|
assert upretty(e) == ucode_str |
|
|
|
|
|
|
|
|
def test_issue_9877(): |
|
|
ucode_str1 = '(2, 3) ∪ ([1, 2] \\ {x})' |
|
|
a, b, c = Interval(2, 3, True, True), Interval(1, 2), FiniteSet(x) |
|
|
assert upretty(Union(a, Complement(b, c))) == ucode_str1 |
|
|
|
|
|
ucode_str2 = '{x} ∩ {y} ∩ ({z} \\ [1, 2])' |
|
|
d, e, f, g = FiniteSet(x), FiniteSet(y), FiniteSet(z), Interval(1, 2) |
|
|
assert upretty(Intersection(d, e, Complement(f, g))) == ucode_str2 |
|
|
|
|
|
|
|
|
def test_issue_13651(): |
|
|
expr1 = c + Mul(-1, a + b, evaluate=False) |
|
|
assert pretty(expr1) == 'c - (a + b)' |
|
|
expr2 = c + Mul(-1, a - b + d, evaluate=False) |
|
|
assert pretty(expr2) == 'c - (a - b + d)' |
|
|
|
|
|
|
|
|
def test_pretty_primenu(): |
|
|
from sympy.functions.combinatorial.numbers import primenu |
|
|
|
|
|
ascii_str1 = "nu(n)" |
|
|
ucode_str1 = "ν(n)" |
|
|
|
|
|
n = symbols('n', integer=True) |
|
|
assert pretty(primenu(n)) == ascii_str1 |
|
|
assert upretty(primenu(n)) == ucode_str1 |
|
|
|
|
|
|
|
|
def test_pretty_primeomega(): |
|
|
from sympy.functions.combinatorial.numbers import primeomega |
|
|
|
|
|
ascii_str1 = "Omega(n)" |
|
|
ucode_str1 = "Ω(n)" |
|
|
|
|
|
n = symbols('n', integer=True) |
|
|
assert pretty(primeomega(n)) == ascii_str1 |
|
|
assert upretty(primeomega(n)) == ucode_str1 |
|
|
|
|
|
|
|
|
def test_pretty_Mod(): |
|
|
from sympy.core import Mod |
|
|
|
|
|
ascii_str1 = "x mod 7" |
|
|
ucode_str1 = "x mod 7" |
|
|
|
|
|
ascii_str2 = "(x + 1) mod 7" |
|
|
ucode_str2 = "(x + 1) mod 7" |
|
|
|
|
|
ascii_str3 = "2*x mod 7" |
|
|
ucode_str3 = "2⋅x mod 7" |
|
|
|
|
|
ascii_str4 = "(x mod 7) + 1" |
|
|
ucode_str4 = "(x mod 7) + 1" |
|
|
|
|
|
ascii_str5 = "2*(x mod 7)" |
|
|
ucode_str5 = "2⋅(x mod 7)" |
|
|
|
|
|
x = symbols('x', integer=True) |
|
|
assert pretty(Mod(x, 7)) == ascii_str1 |
|
|
assert upretty(Mod(x, 7)) == ucode_str1 |
|
|
assert pretty(Mod(x + 1, 7)) == ascii_str2 |
|
|
assert upretty(Mod(x + 1, 7)) == ucode_str2 |
|
|
assert pretty(Mod(2 * x, 7)) == ascii_str3 |
|
|
assert upretty(Mod(2 * x, 7)) == ucode_str3 |
|
|
assert pretty(Mod(x, 7) + 1) == ascii_str4 |
|
|
assert upretty(Mod(x, 7) + 1) == ucode_str4 |
|
|
assert pretty(2 * Mod(x, 7)) == ascii_str5 |
|
|
assert upretty(2 * Mod(x, 7)) == ucode_str5 |
|
|
|
|
|
|
|
|
def test_issue_11801(): |
|
|
assert pretty(Symbol("")) == "" |
|
|
assert upretty(Symbol("")) == "" |
|
|
|
|
|
|
|
|
def test_pretty_UnevaluatedExpr(): |
|
|
x = symbols('x') |
|
|
he = UnevaluatedExpr(1/x) |
|
|
|
|
|
ucode_str = \ |
|
|
"""\ |
|
|
1\n\ |
|
|
─\n\ |
|
|
x\ |
|
|
""" |
|
|
|
|
|
assert upretty(he) == ucode_str |
|
|
|
|
|
ucode_str = \ |
|
|
"""\ |
|
|
2\n\ |
|
|
⎛1⎞ \n\ |
|
|
⎜─⎟ \n\ |
|
|
⎝x⎠ \ |
|
|
""" |
|
|
|
|
|
assert upretty(he**2) == ucode_str |
|
|
|
|
|
ucode_str = \ |
|
|
"""\ |
|
|
1\n\ |
|
|
1 + ─\n\ |
|
|
x\ |
|
|
""" |
|
|
|
|
|
assert upretty(he + 1) == ucode_str |
|
|
|
|
|
ucode_str = \ |
|
|
('''\ |
|
|
1\n\ |
|
|
x⋅─\n\ |
|
|
x\ |
|
|
''') |
|
|
assert upretty(x*he) == ucode_str |
|
|
|
|
|
|
|
|
def test_issue_10472(): |
|
|
M = (Matrix([[0, 0], [0, 0]]), Matrix([0, 0])) |
|
|
|
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛⎡0 0⎤ ⎡0⎤⎞ |
|
|
⎜⎢ ⎥, ⎢ ⎥⎟ |
|
|
⎝⎣0 0⎦ ⎣0⎦⎠\ |
|
|
""" |
|
|
assert upretty(M) == ucode_str |
|
|
|
|
|
|
|
|
def test_MatrixElement_printing(): |
|
|
|
|
|
A = MatrixSymbol("A", 1, 3) |
|
|
B = MatrixSymbol("B", 1, 3) |
|
|
C = MatrixSymbol("C", 1, 3) |
|
|
|
|
|
ascii_str1 = "A_00" |
|
|
ucode_str1 = "A₀₀" |
|
|
assert pretty(A[0, 0]) == ascii_str1 |
|
|
assert upretty(A[0, 0]) == ucode_str1 |
|
|
|
|
|
ascii_str1 = "3*A_00" |
|
|
ucode_str1 = "3⋅A₀₀" |
|
|
assert pretty(3*A[0, 0]) == ascii_str1 |
|
|
assert upretty(3*A[0, 0]) == ucode_str1 |
|
|
|
|
|
ascii_str1 = "(-B + A)[0, 0]" |
|
|
ucode_str1 = "(-B + A)[0, 0]" |
|
|
F = C[0, 0].subs(C, A - B) |
|
|
assert pretty(F) == ascii_str1 |
|
|
assert upretty(F) == ucode_str1 |
|
|
|
|
|
|
|
|
def test_issue_12675(): |
|
|
x, y, t, j = symbols('x y t j') |
|
|
e = CoordSys3D('e') |
|
|
|
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛ t⎞ \n\ |
|
|
⎜⎛x⎞ ⎟ j_e\n\ |
|
|
⎜⎜─⎟ ⎟ \n\ |
|
|
⎝⎝y⎠ ⎠ \ |
|
|
""" |
|
|
assert upretty((x/y)**t*e.j) == ucode_str |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛1⎞ \n\ |
|
|
⎜─⎟ j_e\n\ |
|
|
⎝y⎠ \ |
|
|
""" |
|
|
assert upretty((1/y)*e.j) == ucode_str |
|
|
|
|
|
|
|
|
def test_MatrixSymbol_printing(): |
|
|
|
|
|
A = MatrixSymbol("A", 3, 3) |
|
|
B = MatrixSymbol("B", 3, 3) |
|
|
C = MatrixSymbol("C", 3, 3) |
|
|
assert pretty(-A*B*C) == "-A*B*C" |
|
|
assert pretty(A - B) == "-B + A" |
|
|
assert pretty(A*B*C - A*B - B*C) == "-A*B -B*C + A*B*C" |
|
|
|
|
|
|
|
|
x = MatrixSymbol('x', n, n) |
|
|
y = MatrixSymbol('y*', n, n) |
|
|
assert pretty(x + y) == "x + y*" |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
2 \n\ |
|
|
-2*y* -a*x\ |
|
|
""" |
|
|
assert pretty(-a*x + -2*y*y) == ascii_str |
|
|
|
|
|
|
|
|
def test_degree_printing(): |
|
|
expr1 = 90*degree |
|
|
assert pretty(expr1) == '90°' |
|
|
expr2 = x*degree |
|
|
assert pretty(expr2) == 'x°' |
|
|
expr3 = cos(x*degree + 90*degree) |
|
|
assert pretty(expr3) == 'cos(x° + 90°)' |
|
|
|
|
|
|
|
|
def test_vector_expr_pretty_printing(): |
|
|
A = CoordSys3D('A') |
|
|
|
|
|
assert upretty(Cross(A.i, A.x*A.i+3*A.y*A.j)) == "(i_A)×((x_A) i_A + (3⋅y_A) j_A)" |
|
|
assert upretty(x*Cross(A.i, A.j)) == 'x⋅(i_A)×(j_A)' |
|
|
|
|
|
assert upretty(Curl(A.x*A.i + 3*A.y*A.j)) == "∇×((x_A) i_A + (3⋅y_A) j_A)" |
|
|
|
|
|
assert upretty(Divergence(A.x*A.i + 3*A.y*A.j)) == "∇⋅((x_A) i_A + (3⋅y_A) j_A)" |
|
|
|
|
|
assert upretty(Dot(A.i, A.x*A.i+3*A.y*A.j)) == "(i_A)⋅((x_A) i_A + (3⋅y_A) j_A)" |
|
|
|
|
|
assert upretty(Gradient(A.x+3*A.y)) == "∇(x_A + 3⋅y_A)" |
|
|
assert upretty(Laplacian(A.x+3*A.y)) == "∆(x_A + 3⋅y_A)" |
|
|
|
|
|
|
|
|
|
|
|
def test_pretty_print_tensor_expr(): |
|
|
L = TensorIndexType("L") |
|
|
i, j, k = tensor_indices("i j k", L) |
|
|
i0 = tensor_indices("i_0", L) |
|
|
A, B, C, D = tensor_heads("A B C D", [L]) |
|
|
H = TensorHead("H", [L, L]) |
|
|
|
|
|
expr = -i |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
-i\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
-i\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = A(i) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
i\n\ |
|
|
A \n\ |
|
|
\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
i\n\ |
|
|
A \n\ |
|
|
\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = A(i0) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
i_0\n\ |
|
|
A \n\ |
|
|
\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
i₀\n\ |
|
|
A \n\ |
|
|
\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = A(-i) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
\n\ |
|
|
A \n\ |
|
|
i\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
\n\ |
|
|
A \n\ |
|
|
i\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = -3*A(-i) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
\n\ |
|
|
-3*A \n\ |
|
|
i\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
\n\ |
|
|
-3⋅A \n\ |
|
|
i\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = H(i, -j) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
i \n\ |
|
|
H \n\ |
|
|
j\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
i \n\ |
|
|
H \n\ |
|
|
j\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = H(i, -i) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
L_0 \n\ |
|
|
H \n\ |
|
|
L_0\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
L₀ \n\ |
|
|
H \n\ |
|
|
L₀\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = H(i, -j)*A(j)*B(k) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
i L_0 k\n\ |
|
|
H *A *B \n\ |
|
|
L_0 \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
i L₀ k\n\ |
|
|
H ⋅A ⋅B \n\ |
|
|
L₀ \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = (1+x)*A(i) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
i\n\ |
|
|
(x + 1)*A \n\ |
|
|
\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
i\n\ |
|
|
(x + 1)⋅A \n\ |
|
|
\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = A(i) + 3*B(i) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
i i\n\ |
|
|
3*B + A \n\ |
|
|
\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
i i\n\ |
|
|
3⋅B + A \n\ |
|
|
\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_pretty_print_tensor_partial_deriv(): |
|
|
from sympy.tensor.toperators import PartialDerivative |
|
|
|
|
|
L = TensorIndexType("L") |
|
|
i, j, k = tensor_indices("i j k", L) |
|
|
|
|
|
A, B, C, D = tensor_heads("A B C D", [L]) |
|
|
|
|
|
H = TensorHead("H", [L, L]) |
|
|
|
|
|
expr = PartialDerivative(A(i), A(j)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
d / i\\\n\ |
|
|
---|A |\n\ |
|
|
j\\ /\n\ |
|
|
dA \n\ |
|
|
\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
∂ ⎛ i⎞\n\ |
|
|
───⎜A ⎟\n\ |
|
|
j⎝ ⎠\n\ |
|
|
∂A \n\ |
|
|
\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = A(i)*PartialDerivative(H(k, -i), A(j)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
L_0 d / k \\\n\ |
|
|
A *---|H |\n\ |
|
|
j\\ L_0/\n\ |
|
|
dA \n\ |
|
|
\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
L₀ ∂ ⎛ k ⎞\n\ |
|
|
A ⋅───⎜H ⎟\n\ |
|
|
j⎝ L₀⎠\n\ |
|
|
∂A \n\ |
|
|
\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = A(i)*PartialDerivative(B(k)*C(-i) + 3*H(k, -i), A(j)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
L_0 d / k k \\\n\ |
|
|
A *---|3*H + B *C |\n\ |
|
|
j\\ L_0 L_0/\n\ |
|
|
dA \n\ |
|
|
\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
L₀ ∂ ⎛ k k ⎞\n\ |
|
|
A ⋅───⎜3⋅H + B ⋅C ⎟\n\ |
|
|
j⎝ L₀ L₀⎠\n\ |
|
|
∂A \n\ |
|
|
\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = (A(i) + B(i))*PartialDerivative(C(j), D(j)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ i i\\ d / L_0\\\n\ |
|
|
|A + B |*-----|C |\n\ |
|
|
\\ / L_0\\ /\n\ |
|
|
dD \n\ |
|
|
\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛ i i⎞ ∂ ⎛ L₀⎞\n\ |
|
|
⎜A + B ⎟⋅────⎜C ⎟\n\ |
|
|
⎝ ⎠ L₀⎝ ⎠\n\ |
|
|
∂D \n\ |
|
|
\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = (A(i) + B(i))*PartialDerivative(C(-i), D(j)) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
/ L_0 L_0\\ d / \\\n\ |
|
|
|A + B |*---|C |\n\ |
|
|
\\ / j\\ L_0/\n\ |
|
|
dD \n\ |
|
|
\ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛ L₀ L₀⎞ ∂ ⎛ ⎞\n\ |
|
|
⎜A + B ⎟⋅───⎜C ⎟\n\ |
|
|
⎝ ⎠ j⎝ L₀⎠\n\ |
|
|
∂D \n\ |
|
|
\ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = PartialDerivative(B(-i) + A(-i), A(-j), A(-n)) |
|
|
ucode_str = """\ |
|
|
2 \n\ |
|
|
∂ ⎛ ⎞\n\ |
|
|
───────⎜A + B ⎟\n\ |
|
|
⎝ i i⎠\n\ |
|
|
∂A ∂A \n\ |
|
|
n j \ |
|
|
""" |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = PartialDerivative(3*A(-i), A(-j), A(-n)) |
|
|
ucode_str = """\ |
|
|
2 \n\ |
|
|
∂ ⎛ ⎞\n\ |
|
|
───────⎜3⋅A ⎟\n\ |
|
|
⎝ i⎠\n\ |
|
|
∂A ∂A \n\ |
|
|
n j \ |
|
|
""" |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = TensorElement(H(i, j), {i:1}) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
i=1,j\n\ |
|
|
H \n\ |
|
|
\ |
|
|
""" |
|
|
ucode_str = ascii_str |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = TensorElement(H(i, j), {i: 1, j: 1}) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
i=1,j=1\n\ |
|
|
H \n\ |
|
|
\ |
|
|
""" |
|
|
ucode_str = ascii_str |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = TensorElement(H(i, j), {j: 1}) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
i,j=1\n\ |
|
|
H \n\ |
|
|
\ |
|
|
""" |
|
|
ucode_str = ascii_str |
|
|
|
|
|
expr = TensorElement(H(-i, j), {-i: 1}) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
j\n\ |
|
|
H \n\ |
|
|
i=1 \ |
|
|
""" |
|
|
ucode_str = ascii_str |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_issue_15560(): |
|
|
a = MatrixSymbol('a', 1, 1) |
|
|
e = pretty(a*(KroneckerProduct(a, a))) |
|
|
result = 'a*(a x a)' |
|
|
assert e == result |
|
|
|
|
|
|
|
|
def test_print_polylog(): |
|
|
|
|
|
uresult = 'Li₂(3)' |
|
|
aresult = 'polylog(2, 3)' |
|
|
assert pretty(polylog(2, 3)) == aresult |
|
|
assert upretty(polylog(2, 3)) == uresult |
|
|
|
|
|
|
|
|
|
|
|
def test_print_expint_polylog_symbolic_order(): |
|
|
s, z = symbols("s, z") |
|
|
uresult = 'Liₛ(z)' |
|
|
aresult = 'polylog(s, z)' |
|
|
assert pretty(polylog(s, z)) == aresult |
|
|
assert upretty(polylog(s, z)) == uresult |
|
|
|
|
|
uresult = 'Eₛ(z)' |
|
|
aresult = 'expint(s, z)' |
|
|
assert pretty(expint(s, z)) == aresult |
|
|
assert upretty(expint(s, z)) == uresult |
|
|
|
|
|
|
|
|
|
|
|
def test_print_polylog_long_order_issue_25309(): |
|
|
s, z = symbols("s, z") |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
⎛ 2 ⎞\n\ |
|
|
polylog⎝s , z⎠\ |
|
|
""" |
|
|
assert upretty(polylog(s**2, z)) == ucode_str |
|
|
|
|
|
|
|
|
def test_print_lerchphi(): |
|
|
|
|
|
a = Symbol('a') |
|
|
pretty(lerchphi(a, 1, 2)) |
|
|
uresult = 'Φ(a, 1, 2)' |
|
|
aresult = 'lerchphi(a, 1, 2)' |
|
|
assert pretty(lerchphi(a, 1, 2)) == aresult |
|
|
assert upretty(lerchphi(a, 1, 2)) == uresult |
|
|
|
|
|
|
|
|
def test_issue_15583(): |
|
|
|
|
|
N = mechanics.ReferenceFrame('N') |
|
|
result = '(n_x, n_y, n_z)' |
|
|
e = pretty((N.x, N.y, N.z)) |
|
|
assert e == result |
|
|
|
|
|
|
|
|
def test_matrixSymbolBold(): |
|
|
|
|
|
def boldpretty(expr): |
|
|
return xpretty(expr, use_unicode=True, wrap_line=False, mat_symbol_style="bold") |
|
|
|
|
|
from sympy.matrices.expressions.trace import trace |
|
|
A = MatrixSymbol("A", 2, 2) |
|
|
assert boldpretty(trace(A)) == 'tr(𝐀)' |
|
|
|
|
|
A = MatrixSymbol("A", 3, 3) |
|
|
B = MatrixSymbol("B", 3, 3) |
|
|
C = MatrixSymbol("C", 3, 3) |
|
|
|
|
|
assert boldpretty(-A) == '-𝐀' |
|
|
assert boldpretty(A - A*B - B) == '-𝐁 -𝐀⋅𝐁 + 𝐀' |
|
|
assert boldpretty(-A*B - A*B*C - B) == '-𝐁 -𝐀⋅𝐁 -𝐀⋅𝐁⋅𝐂' |
|
|
|
|
|
A = MatrixSymbol("Addot", 3, 3) |
|
|
assert boldpretty(A) == '𝐀̈' |
|
|
omega = MatrixSymbol("omega", 3, 3) |
|
|
assert boldpretty(omega) == 'ω' |
|
|
omega = MatrixSymbol("omeganorm", 3, 3) |
|
|
assert boldpretty(omega) == '‖ω‖' |
|
|
|
|
|
a = Symbol('alpha') |
|
|
b = Symbol('b') |
|
|
c = MatrixSymbol("c", 3, 1) |
|
|
d = MatrixSymbol("d", 3, 1) |
|
|
|
|
|
assert boldpretty(a*B*c+b*d) == 'b⋅𝐝 + α⋅𝐁⋅𝐜' |
|
|
|
|
|
d = MatrixSymbol("delta", 3, 1) |
|
|
B = MatrixSymbol("Beta", 3, 3) |
|
|
|
|
|
assert boldpretty(a*B*c+b*d) == 'b⋅δ + α⋅Β⋅𝐜' |
|
|
|
|
|
A = MatrixSymbol("A_2", 3, 3) |
|
|
assert boldpretty(A) == '𝐀₂' |
|
|
|
|
|
|
|
|
def test_center_accent(): |
|
|
assert center_accent('a', '\N{COMBINING TILDE}') == 'ã' |
|
|
assert center_accent('aa', '\N{COMBINING TILDE}') == 'aã' |
|
|
assert center_accent('aaa', '\N{COMBINING TILDE}') == 'aãa' |
|
|
assert center_accent('aaaa', '\N{COMBINING TILDE}') == 'aaãa' |
|
|
assert center_accent('aaaaa', '\N{COMBINING TILDE}') == 'aaãaa' |
|
|
assert center_accent('abcdefg', '\N{COMBINING FOUR DOTS ABOVE}') == 'abcd⃜efg' |
|
|
|
|
|
|
|
|
def test_imaginary_unit(): |
|
|
from sympy.printing.pretty import pretty |
|
|
assert pretty(1 + I, use_unicode=False) == '1 + I' |
|
|
assert pretty(1 + I, use_unicode=True) == '1 + ⅈ' |
|
|
assert pretty(1 + I, use_unicode=False, imaginary_unit='j') == '1 + I' |
|
|
assert pretty(1 + I, use_unicode=True, imaginary_unit='j') == '1 + ⅉ' |
|
|
|
|
|
raises(TypeError, lambda: pretty(I, imaginary_unit=I)) |
|
|
raises(ValueError, lambda: pretty(I, imaginary_unit="kkk")) |
|
|
|
|
|
|
|
|
def test_str_special_matrices(): |
|
|
from sympy.matrices import Identity, ZeroMatrix, OneMatrix |
|
|
assert pretty(Identity(4)) == 'I' |
|
|
assert upretty(Identity(4)) == '𝕀' |
|
|
assert pretty(ZeroMatrix(2, 2)) == '0' |
|
|
assert upretty(ZeroMatrix(2, 2)) == '𝟘' |
|
|
assert pretty(OneMatrix(2, 2)) == '1' |
|
|
assert upretty(OneMatrix(2, 2)) == '𝟙' |
|
|
|
|
|
|
|
|
def test_pretty_misc_functions(): |
|
|
assert pretty(LambertW(x)) == 'W(x)' |
|
|
assert upretty(LambertW(x)) == 'W(x)' |
|
|
assert pretty(LambertW(x, y)) == 'W(x, y)' |
|
|
assert upretty(LambertW(x, y)) == 'W(x, y)' |
|
|
assert pretty(airyai(x)) == 'Ai(x)' |
|
|
assert upretty(airyai(x)) == 'Ai(x)' |
|
|
assert pretty(airybi(x)) == 'Bi(x)' |
|
|
assert upretty(airybi(x)) == 'Bi(x)' |
|
|
assert pretty(airyaiprime(x)) == "Ai'(x)" |
|
|
assert upretty(airyaiprime(x)) == "Ai'(x)" |
|
|
assert pretty(airybiprime(x)) == "Bi'(x)" |
|
|
assert upretty(airybiprime(x)) == "Bi'(x)" |
|
|
assert pretty(fresnelc(x)) == 'C(x)' |
|
|
assert upretty(fresnelc(x)) == 'C(x)' |
|
|
assert pretty(fresnels(x)) == 'S(x)' |
|
|
assert upretty(fresnels(x)) == 'S(x)' |
|
|
assert pretty(Heaviside(x)) == 'Heaviside(x)' |
|
|
assert upretty(Heaviside(x)) == 'θ(x)' |
|
|
assert pretty(Heaviside(x, y)) == 'Heaviside(x, y)' |
|
|
assert upretty(Heaviside(x, y)) == 'θ(x, y)' |
|
|
assert pretty(dirichlet_eta(x)) == 'dirichlet_eta(x)' |
|
|
assert upretty(dirichlet_eta(x)) == 'η(x)' |
|
|
|
|
|
|
|
|
def test_hadamard_power(): |
|
|
m, n, p = symbols('m, n, p', integer=True) |
|
|
A = MatrixSymbol('A', m, n) |
|
|
B = MatrixSymbol('B', m, n) |
|
|
|
|
|
|
|
|
expr = hadamard_power(A, n) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
.n\n\ |
|
|
A \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
∘n\n\ |
|
|
A \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = hadamard_power(A, 1+n) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
.(n + 1)\n\ |
|
|
A \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
∘(n + 1)\n\ |
|
|
A \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
expr = hadamard_power(A*B.T, 1+n) |
|
|
ascii_str = \ |
|
|
"""\ |
|
|
.(n + 1)\n\ |
|
|
/ T\\ \n\ |
|
|
\\A*B / \ |
|
|
""" |
|
|
ucode_str = \ |
|
|
"""\ |
|
|
∘(n + 1)\n\ |
|
|
⎛ T⎞ \n\ |
|
|
⎝A⋅B ⎠ \ |
|
|
""" |
|
|
assert pretty(expr) == ascii_str |
|
|
assert upretty(expr) == ucode_str |
|
|
|
|
|
|
|
|
def test_issue_17258(): |
|
|
n = Symbol('n', integer=True) |
|
|
assert pretty(Sum(n, (n, -oo, 1))) == \ |
|
|
' 1 \n'\ |
|
|
' __ \n'\ |
|
|
' \\ ` \n'\ |
|
|
' ) n\n'\ |
|
|
' /_, \n'\ |
|
|
'n = -oo ' |
|
|
|
|
|
assert upretty(Sum(n, (n, -oo, 1))) == \ |
|
|
"""\ |
|
|
1 \n\ |
|
|
___ \n\ |
|
|
╲ \n\ |
|
|
╲ \n\ |
|
|
╱ n\n\ |
|
|
╱ \n\ |
|
|
‾‾‾ \n\ |
|
|
n = -∞ \ |
|
|
""" |
|
|
|
|
|
|
|
|
def test_is_combining(): |
|
|
line = "v̇_m" |
|
|
assert [is_combining(sym) for sym in line] == \ |
|
|
[False, True, False, False] |
|
|
|
|
|
|
|
|
def test_issue_17616(): |
|
|
assert pretty(pi**(1/exp(1))) == \ |
|
|
' / -1\\\n'\ |
|
|
' \\e /\n'\ |
|
|
'pi ' |
|
|
|
|
|
assert upretty(pi**(1/exp(1))) == \ |
|
|
' ⎛ -1⎞\n'\ |
|
|
' ⎝ℯ ⎠\n'\ |
|
|
'π ' |
|
|
|
|
|
assert pretty(pi**(1/pi)) == \ |
|
|
' 1 \n'\ |
|
|
' --\n'\ |
|
|
' pi\n'\ |
|
|
'pi ' |
|
|
|
|
|
assert upretty(pi**(1/pi)) == \ |
|
|
' 1\n'\ |
|
|
' ─\n'\ |
|
|
' π\n'\ |
|
|
'π ' |
|
|
|
|
|
assert pretty(pi**(1/EulerGamma)) == \ |
|
|
' 1 \n'\ |
|
|
' ----------\n'\ |
|
|
' EulerGamma\n'\ |
|
|
'pi ' |
|
|
|
|
|
assert upretty(pi**(1/EulerGamma)) == \ |
|
|
' 1\n'\ |
|
|
' ─\n'\ |
|
|
' γ\n'\ |
|
|
'π ' |
|
|
|
|
|
z = Symbol("x_17") |
|
|
assert upretty(7**(1/z)) == \ |
|
|
'x₁₇___\n'\ |
|
|
' ╲╱ 7 ' |
|
|
|
|
|
assert pretty(7**(1/z)) == \ |
|
|
'x_17___\n'\ |
|
|
' \\/ 7 ' |
|
|
|
|
|
|
|
|
def test_issue_17857(): |
|
|
assert pretty(Range(-oo, oo)) == '{..., -1, 0, 1, ...}' |
|
|
assert pretty(Range(oo, -oo, -1)) == '{..., 1, 0, -1, ...}' |
|
|
|
|
|
|
|
|
def test_issue_18272(): |
|
|
x = Symbol('x') |
|
|
n = Symbol('n') |
|
|
|
|
|
assert upretty(ConditionSet(x, Eq(-x + exp(x), 0), S.Complexes)) == \ |
|
|
'⎧ │ ⎛ x ⎞⎫\n'\ |
|
|
'⎨x │ x ∊ ℂ ∧ ⎝-x + ℯ = 0⎠⎬\n'\ |
|
|
'⎩ │ ⎭' |
|
|
assert upretty(ConditionSet(x, Contains(n/2, Interval(0, oo)), FiniteSet(-n/2, n/2))) == \ |
|
|
'⎧ │ ⎧-n n⎫ ⎛n ⎞⎫\n'\ |
|
|
'⎨x │ x ∊ ⎨───, ─⎬ ∧ ⎜─ ∈ [0, ∞)⎟⎬\n'\ |
|
|
'⎩ │ ⎩ 2 2⎭ ⎝2 ⎠⎭' |
|
|
assert upretty(ConditionSet(x, Eq(Piecewise((1, x >= 3), (x/2 - 1/2, x >= 2), (1/2, x >= 1), |
|
|
(x/2, True)) - 1/2, 0), Interval(0, 3))) == \ |
|
|
'⎧ │ ⎛⎛⎧ 1 for x ≥ 3⎞ ⎞⎫\n'\ |
|
|
'⎪ │ ⎜⎜⎪ ⎟ ⎟⎪\n'\ |
|
|
'⎪ │ ⎜⎜⎪x ⎟ ⎟⎪\n'\ |
|
|
'⎪ │ ⎜⎜⎪─ - 0.5 for x ≥ 2⎟ ⎟⎪\n'\ |
|
|
'⎪ │ ⎜⎜⎪2 ⎟ ⎟⎪\n'\ |
|
|
'⎨x │ x ∊ [0, 3] ∧ ⎜⎜⎨ ⎟ - 0.5 = 0⎟⎬\n'\ |
|
|
'⎪ │ ⎜⎜⎪ 0.5 for x ≥ 1⎟ ⎟⎪\n'\ |
|
|
'⎪ │ ⎜⎜⎪ ⎟ ⎟⎪\n'\ |
|
|
'⎪ │ ⎜⎜⎪ x ⎟ ⎟⎪\n'\ |
|
|
'⎪ │ ⎜⎜⎪ ─ otherwise⎟ ⎟⎪\n'\ |
|
|
'⎩ │ ⎝⎝⎩ 2 ⎠ ⎠⎭' |
|
|
|
|
|
|
|
|
def test_Str(): |
|
|
from sympy.core.symbol import Str |
|
|
assert pretty(Str('x')) == 'x' |
|
|
|
|
|
|
|
|
def test_symbolic_probability(): |
|
|
mu = symbols("mu") |
|
|
sigma = symbols("sigma", positive=True) |
|
|
X = Normal("X", mu, sigma) |
|
|
assert pretty(Expectation(X)) == r'E[X]' |
|
|
assert pretty(Variance(X)) == r'Var(X)' |
|
|
assert pretty(Probability(X > 0)) == r'P(X > 0)' |
|
|
Y = Normal("Y", mu, sigma) |
|
|
assert pretty(Covariance(X, Y)) == 'Cov(X, Y)' |
|
|
|
|
|
|
|
|
def test_issue_21758(): |
|
|
from sympy.functions.elementary.piecewise import piecewise_fold |
|
|
from sympy.series.fourier import FourierSeries |
|
|
x = Symbol('x') |
|
|
k, n = symbols('k n') |
|
|
fo = FourierSeries(x, (x, -pi, pi), (0, SeqFormula(0, (k, 1, oo)), SeqFormula( |
|
|
Piecewise((-2*pi*cos(n*pi)/n + 2*sin(n*pi)/n**2, (n > -oo) & (n < oo) & Ne(n, 0)), |
|
|
(0, True))*sin(n*x)/pi, (n, 1, oo)))) |
|
|
assert upretty(piecewise_fold(fo)) == \ |
|
|
'⎧ 2⋅sin(3⋅x) \n'\ |
|
|
'⎪2⋅sin(x) - sin(2⋅x) + ────────── + … for n > -∞ ∧ n < ∞ ∧ n ≠ 0\n'\ |
|
|
'⎨ 3 \n'\ |
|
|
'⎪ \n'\ |
|
|
'⎩ 0 otherwise ' |
|
|
assert pretty(FourierSeries(x, (x, -pi, pi), (0, SeqFormula(0, (k, 1, oo)), |
|
|
SeqFormula(0, (n, 1, oo))))) == '0' |
|
|
|
|
|
|
|
|
def test_diffgeom(): |
|
|
from sympy.diffgeom import Manifold, Patch, CoordSystem, BaseScalarField |
|
|
x,y = symbols('x y', real=True) |
|
|
m = Manifold('M', 2) |
|
|
assert pretty(m) == 'M' |
|
|
p = Patch('P', m) |
|
|
assert pretty(p) == "P" |
|
|
rect = CoordSystem('rect', p, [x, y]) |
|
|
assert pretty(rect) == "rect" |
|
|
b = BaseScalarField(rect, 0) |
|
|
assert pretty(b) == "x" |
|
|
|
|
|
|
|
|
def test_deprecated_prettyForm(): |
|
|
with warns_deprecated_sympy(): |
|
|
from sympy.printing.pretty.pretty_symbology import xstr |
|
|
assert xstr(1) == '1' |
|
|
|
|
|
with warns_deprecated_sympy(): |
|
|
from sympy.printing.pretty.stringpict import prettyForm |
|
|
p = prettyForm('s', unicode='s') |
|
|
|
|
|
with warns_deprecated_sympy(): |
|
|
assert p.unicode == p.s == 's' |
|
|
|
|
|
|
|
|
def test_center(): |
|
|
assert center('1', 2) == '1 ' |
|
|
assert center('1', 3) == ' 1 ' |
|
|
assert center('1', 3, '-') == '-1-' |
|
|
assert center('1', 5, '-') == '--1--' |
|
|
|