123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- from sympy.core.function import (Derivative, Function)
- from sympy.core.numbers import (I, Rational, oo, pi)
- from sympy.core.relational import (Eq, Ge, Gt, Le, Lt, Ne)
- from sympy.core.symbol import (Symbol, symbols)
- from sympy.functions.elementary.complexes import (Abs, conjugate)
- from sympy.functions.elementary.exponential import (exp, log)
- from sympy.functions.elementary.miscellaneous import sqrt
- from sympy.functions.elementary.trigonometric import sin
- from sympy.integrals.integrals import Integral
- from sympy.matrices.dense import Matrix
- from sympy.series.limits import limit
- from sympy.printing.python import python
- from sympy.testing.pytest import raises, XFAIL
- x, y = symbols('x,y')
- th = Symbol('theta')
- ph = Symbol('phi')
- def test_python_basic():
- # Simple numbers/symbols
- assert python(-Rational(1)/2) == "e = Rational(-1, 2)"
- assert python(-Rational(13)/22) == "e = Rational(-13, 22)"
- assert python(oo) == "e = oo"
- # Powers
- assert python(x**2) == "x = Symbol(\'x\')\ne = x**2"
- assert python(1/x) == "x = Symbol('x')\ne = 1/x"
- assert python(y*x**-2) == "y = Symbol('y')\nx = Symbol('x')\ne = y/x**2"
- assert python(
- x**Rational(-5, 2)) == "x = Symbol('x')\ne = x**Rational(-5, 2)"
- # Sums of terms
- assert python(x**2 + x + 1) in [
- "x = Symbol('x')\ne = 1 + x + x**2",
- "x = Symbol('x')\ne = x + x**2 + 1",
- "x = Symbol('x')\ne = x**2 + x + 1", ]
- assert python(1 - x) in [
- "x = Symbol('x')\ne = 1 - x",
- "x = Symbol('x')\ne = -x + 1"]
- assert python(1 - 2*x) in [
- "x = Symbol('x')\ne = 1 - 2*x",
- "x = Symbol('x')\ne = -2*x + 1"]
- assert python(1 - Rational(3, 2)*y/x) in [
- "y = Symbol('y')\nx = Symbol('x')\ne = 1 - 3/2*y/x",
- "y = Symbol('y')\nx = Symbol('x')\ne = -3/2*y/x + 1",
- "y = Symbol('y')\nx = Symbol('x')\ne = 1 - 3*y/(2*x)"]
- # Multiplication
- assert python(x/y) == "x = Symbol('x')\ny = Symbol('y')\ne = x/y"
- assert python(-x/y) == "x = Symbol('x')\ny = Symbol('y')\ne = -x/y"
- assert python((x + 2)/y) in [
- "y = Symbol('y')\nx = Symbol('x')\ne = 1/y*(2 + x)",
- "y = Symbol('y')\nx = Symbol('x')\ne = 1/y*(x + 2)",
- "x = Symbol('x')\ny = Symbol('y')\ne = 1/y*(2 + x)",
- "x = Symbol('x')\ny = Symbol('y')\ne = (2 + x)/y",
- "x = Symbol('x')\ny = Symbol('y')\ne = (x + 2)/y"]
- assert python((1 + x)*y) in [
- "y = Symbol('y')\nx = Symbol('x')\ne = y*(1 + x)",
- "y = Symbol('y')\nx = Symbol('x')\ne = y*(x + 1)", ]
- # Check for proper placement of negative sign
- assert python(-5*x/(x + 10)) == "x = Symbol('x')\ne = -5*x/(x + 10)"
- assert python(1 - Rational(3, 2)*(x + 1)) in [
- "x = Symbol('x')\ne = Rational(-3, 2)*x + Rational(-1, 2)",
- "x = Symbol('x')\ne = -3*x/2 + Rational(-1, 2)",
- "x = Symbol('x')\ne = -3*x/2 + Rational(-1, 2)"
- ]
- def test_python_keyword_symbol_name_escaping():
- # Check for escaping of keywords
- assert python(
- 5*Symbol("lambda")) == "lambda_ = Symbol('lambda')\ne = 5*lambda_"
- assert (python(5*Symbol("lambda") + 7*Symbol("lambda_")) ==
- "lambda__ = Symbol('lambda')\nlambda_ = Symbol('lambda_')\ne = 7*lambda_ + 5*lambda__")
- assert (python(5*Symbol("for") + Function("for_")(8)) ==
- "for__ = Symbol('for')\nfor_ = Function('for_')\ne = 5*for__ + for_(8)")
- def test_python_keyword_function_name_escaping():
- assert python(
- 5*Function("for")(8)) == "for_ = Function('for')\ne = 5*for_(8)"
- def test_python_relational():
- assert python(Eq(x, y)) == "x = Symbol('x')\ny = Symbol('y')\ne = Eq(x, y)"
- assert python(Ge(x, y)) == "x = Symbol('x')\ny = Symbol('y')\ne = x >= y"
- assert python(Le(x, y)) == "x = Symbol('x')\ny = Symbol('y')\ne = x <= y"
- assert python(Gt(x, y)) == "x = Symbol('x')\ny = Symbol('y')\ne = x > y"
- assert python(Lt(x, y)) == "x = Symbol('x')\ny = Symbol('y')\ne = x < y"
- assert python(Ne(x/(y + 1), y**2)) in [
- "x = Symbol('x')\ny = Symbol('y')\ne = Ne(x/(1 + y), y**2)",
- "x = Symbol('x')\ny = Symbol('y')\ne = Ne(x/(y + 1), y**2)"]
- def test_python_functions():
- # Simple
- assert python(2*x + exp(x)) in "x = Symbol('x')\ne = 2*x + exp(x)"
- assert python(sqrt(2)) == 'e = sqrt(2)'
- assert python(2**Rational(1, 3)) == 'e = 2**Rational(1, 3)'
- assert python(sqrt(2 + pi)) == 'e = sqrt(2 + pi)'
- assert python((2 + pi)**Rational(1, 3)) == 'e = (2 + pi)**Rational(1, 3)'
- assert python(2**Rational(1, 4)) == 'e = 2**Rational(1, 4)'
- assert python(Abs(x)) == "x = Symbol('x')\ne = Abs(x)"
- assert python(
- Abs(x/(x**2 + 1))) in ["x = Symbol('x')\ne = Abs(x/(1 + x**2))",
- "x = Symbol('x')\ne = Abs(x/(x**2 + 1))"]
- # Univariate/Multivariate functions
- f = Function('f')
- assert python(f(x)) == "x = Symbol('x')\nf = Function('f')\ne = f(x)"
- assert python(f(x, y)) == "x = Symbol('x')\ny = Symbol('y')\nf = Function('f')\ne = f(x, y)"
- assert python(f(x/(y + 1), y)) in [
- "x = Symbol('x')\ny = Symbol('y')\nf = Function('f')\ne = f(x/(1 + y), y)",
- "x = Symbol('x')\ny = Symbol('y')\nf = Function('f')\ne = f(x/(y + 1), y)"]
- # Nesting of square roots
- assert python(sqrt((sqrt(x + 1)) + 1)) in [
- "x = Symbol('x')\ne = sqrt(1 + sqrt(1 + x))",
- "x = Symbol('x')\ne = sqrt(sqrt(x + 1) + 1)"]
- # Nesting of powers
- assert python((((x + 1)**Rational(1, 3)) + 1)**Rational(1, 3)) in [
- "x = Symbol('x')\ne = (1 + (1 + x)**Rational(1, 3))**Rational(1, 3)",
- "x = Symbol('x')\ne = ((x + 1)**Rational(1, 3) + 1)**Rational(1, 3)"]
- # Function powers
- assert python(sin(x)**2) == "x = Symbol('x')\ne = sin(x)**2"
- @XFAIL
- def test_python_functions_conjugates():
- a, b = map(Symbol, 'ab')
- assert python( conjugate(a + b*I) ) == '_ _\na - I*b'
- assert python( conjugate(exp(a + b*I)) ) == ' _ _\n a - I*b\ne '
- def test_python_derivatives():
- # Simple
- f_1 = Derivative(log(x), x, evaluate=False)
- assert python(f_1) == "x = Symbol('x')\ne = Derivative(log(x), x)"
- f_2 = Derivative(log(x), x, evaluate=False) + x
- assert python(f_2) == "x = Symbol('x')\ne = x + Derivative(log(x), x)"
- # Multiple symbols
- f_3 = Derivative(log(x) + x**2, x, y, evaluate=False)
- assert python(f_3) == \
- "x = Symbol('x')\ny = Symbol('y')\ne = Derivative(x**2 + log(x), x, y)"
- f_4 = Derivative(2*x*y, y, x, evaluate=False) + x**2
- assert python(f_4) in [
- "x = Symbol('x')\ny = Symbol('y')\ne = x**2 + Derivative(2*x*y, y, x)",
- "x = Symbol('x')\ny = Symbol('y')\ne = Derivative(2*x*y, y, x) + x**2"]
- def test_python_integrals():
- # Simple
- f_1 = Integral(log(x), x)
- assert python(f_1) == "x = Symbol('x')\ne = Integral(log(x), x)"
- f_2 = Integral(x**2, x)
- assert python(f_2) == "x = Symbol('x')\ne = Integral(x**2, x)"
- # Double nesting of pow
- f_3 = Integral(x**(2**x), x)
- assert python(f_3) == "x = Symbol('x')\ne = Integral(x**(2**x), x)"
- # Definite integrals
- f_4 = Integral(x**2, (x, 1, 2))
- assert python(f_4) == "x = Symbol('x')\ne = Integral(x**2, (x, 1, 2))"
- f_5 = Integral(x**2, (x, Rational(1, 2), 10))
- assert python(
- f_5) == "x = Symbol('x')\ne = Integral(x**2, (x, Rational(1, 2), 10))"
- # Nested integrals
- f_6 = Integral(x**2*y**2, x, y)
- assert python(f_6) == "x = Symbol('x')\ny = Symbol('y')\ne = Integral(x**2*y**2, x, y)"
- def test_python_matrix():
- p = python(Matrix([[x**2+1, 1], [y, x+y]]))
- s = "x = Symbol('x')\ny = Symbol('y')\ne = MutableDenseMatrix([[x**2 + 1, 1], [y, x + y]])"
- assert p == s
- def test_python_limits():
- assert python(limit(x, x, oo)) == 'e = oo'
- assert python(limit(x**2, x, 0)) == 'e = 0'
- def test_issue_20762():
- # Make sure Python removes curly braces from subscripted variables
- a_b = Symbol('a_{b}')
- b = Symbol('b')
- expr = a_b*b
- assert python(expr) == "a_b = Symbol('a_{b}')\nb = Symbol('b')\ne = a_b*b"
- def test_settings():
- raises(TypeError, lambda: python(x, method="garbage"))
|