I've implemented an evaluate=False option for Add, Mul, Pow and functions (see attachment). This could be useful to suppress default behavior like Sub(x,y) -> Add(x,Mul(-1,y)) for code generation etc. As it happens, I need something like this for evalf testing as well.
Fredrik --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sympy" group. To post to this group, send email to sympy@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sympy?hl=en -~----------~----~----~----~------~----~------~--~---
# HG changeset patch # User Fredrik Johansson <[EMAIL PROTECTED]> # Date 1213795035 -7200 # Node ID 809a34695ade804a9d3efce6ad8f100f05dafe73 # Parent 0842457787a92e2132778d3a379dd0f40dea6333 implement evaluate=False option for Add, Mul, Pow and functions diff -r 0842457787a9 -r 809a34695ade sympy/core/function.py --- a/sympy/core/function.py Tue Jun 17 18:26:55 2008 +0200 +++ b/sympy/core/function.py Wed Jun 18 15:17:15 2008 +0200 @@ -126,6 +126,8 @@ if opt in options: del options[opt] # up to here. + if options.get('evaluate') is False: + return Basic.__new__(cls, *args, **options) r = cls.canonize(*args, **options) if isinstance(r, Basic): return r diff -r 0842457787a9 -r 809a34695ade sympy/core/operations.py --- a/sympy/core/operations.py Tue Jun 17 18:26:55 2008 +0200 +++ b/sympy/core/operations.py Wed Jun 18 15:17:15 2008 +0200 @@ -21,6 +21,8 @@ @cacheit def __new__(cls, *args, **assumptions): + if assumptions.get('evaluate') is False: + return Basic.__new__(cls, *map(_sympify, args), **assumptions) if len(args)==0: return cls.identity() if len(args)==1: diff -r 0842457787a9 -r 809a34695ade sympy/core/power.py --- a/sympy/core/power.py Tue Jun 17 18:26:55 2008 +0200 +++ b/sympy/core/power.py Wed Jun 18 15:17:15 2008 +0200 @@ -60,6 +60,8 @@ def __new__(cls, a, b, **assumptions): a = _sympify(a) b = _sympify(b) + if assumptions.get('evaluate') is False: + return Basic.__new__(cls, a, b, **assumptions) if b is S.Zero: return S.One if b is S.One: diff -r 0842457787a9 -r 809a34695ade sympy/core/tests/test_arit.py --- a/sympy/core/tests/test_arit.py Tue Jun 17 18:26:55 2008 +0200 +++ b/sympy/core/tests/test_arit.py Wed Jun 18 15:17:15 2008 +0200 @@ -1,5 +1,5 @@ from sympy import Symbol, sin, cos, exp, O, sqrt, Rational, Real, re, pi, \ - sympify, sqrt + sympify, sqrt, Add, Mul, Pow from sympy.utilities.pytest import XFAIL x = Symbol("x") @@ -941,3 +941,17 @@ e = 2*a + b f = b + 2*a assert e == f + +def test_suppressed_evaluation(): + a = Add(1,3,2,evaluate=False) + b = Mul(1,3,2,evaluate=False) + c = Pow(3,2,evaluate=False) + assert a != 6 + assert a.func is Add + assert a.args == (1,3,2) + assert b != 6 + assert b.func is Mul + assert b.args == (1,3,2) + assert c != 9 + assert c.func is Pow + assert c.args == (3,2) diff -r 0842457787a9 -r 809a34695ade sympy/core/tests/test_functions.py --- a/sympy/core/tests/test_functions.py Tue Jun 17 18:26:55 2008 +0200 +++ b/sympy/core/tests/test_functions.py Wed Jun 18 15:17:15 2008 +0200 @@ -277,3 +277,10 @@ assert diff(x**3, x) == 3*x**2 assert diff(x**3, x, evaluate=False) != 3*x**2 assert diff(x**3, x, evaluate=False) == Derivative(x**3, x) + +def test_suppressed_evaluation(): + a = sin(0,evaluate=False) + assert a != 0 + assert str(a) == "sin(0)" + assert a.func is sin + assert a.args == (0,)