I thought subs could do this, but apparently that only works for undefined functions. But this should work
logs = expr.atoms(log) repl = [(l, Piecewise((0, Eq(l.args[0], 0)), (l, True))) for l in logs] expr = expr.subs(repl) Aaron Meurer On Wed, Aug 8, 2012 at 2:48 PM, Matthew Rocklin <[email protected]> wrote: > Ah, I see. You want to substitute in monkey_log(whatever) for every > instance of log(whatever) in some expression. > > @sympy community - Do we have any technology to traverse the AST tree > and replace nodes with transformed nodes? > > SymPy has some basic pattern matching. I've never used it though. > Perhaps a combination of it and subs could help here? > > > On Wed, Aug 8, 2012 at 1:39 PM, Skipper Seabold <[email protected]> wrote: >> On Wed, Aug 8, 2012 at 2:02 PM, Matthew Rocklin <[email protected]> wrote: >>> >>> Would Piecewise work well here? >>> >>> >>> # Return 0 if x==0 else return log(x) >>> >>> monkey_log = Piecewise((0, Eq(x, 0)), (log(x), True)) >>> >>> fn = lambdify(x, monkey_log, 'mpmath') >>> >>> fn(0) >>> 0 >>> >>> fn(2.71828) >>> 0.999999327347282 >>> >> >> Maybe I'm being dense, but I'm not sure I understand correctly what to do >> with this. How do I inject this into the namespace used for evaluating >> lam_func in the below? I want to replace the log function which is part of a >> bigger expression. >> >> Skipper >> >>> >>> >>> >>> On Wed, Aug 8, 2012 at 11:37 AM, Skipper Seabold <[email protected]> >>> wrote: >>>> >>>> Hi, >>>> >>>> I'm trying to evaluate a Hessian that I'm computing symbolically. To do >>>> so, I'd like to monkey-patch the mpmath.log function to define log(0) == 0. >>>> I can replicate the error with the minimal example below. I get >>>> >>>> /usr/local/lib/python2.7/dist-packages/sympy/core/function.pyc in >>>> __new__(cls, *args, **options) >>>> 606 args = map(sympify, args) >>>> 607 result = super(AppliedUndef, cls).__new__(cls, *args, >>>> **options) >>>> --> 608 result.nargs = len(args) >>>> 609 return result >>>> 610 >>>> >>>> AttributeError: 'Float' object has no attribute 'nargs' >>>> >>>> >>>> However, what I'm seeing with my actual script is that the first time I >>>> run it, I get this error. The second time, it works, which is baffling. I >>>> am >>>> on recent sympy master from git. Anyone have any ideas? Am I doing this >>>> wrong? >>>> >>>> import sympy >>>> from sympy.abc import y,x,z >>>> from sympy.utilities.lambdify import implemented_function >>>> from sympy import Function >>>> from mpmath import mpf, log as mplog >>>> >>>> func_ = y * sympy.log(x) * z >>>> func = func_(y, x).subs({z : 2.0}) >>>> >>>> log = implemented_function(Function("log"), lambda x : mpf(0) if x == 0 >>>> else mplog(x)) >>>> >>>> lam_func = sympy.lambdify((y, x), func, [{'log' : log}, 'mpmath']) >>>> >>>> data = (1., 2.) >>>> lam_func(*data) >>>> >>>> Thanks, >>>> >>>> Skipper >>>> >>>> -- >>>> You received this message because you are subscribed to the Google Groups >>>> "sympy" group. >>>> To post to this group, send email to [email protected]. >>>> 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. >>> >>> >>> -- >>> You received this message because you are subscribed to the Google Groups >>> "sympy" group. >>> To post to this group, send email to [email protected]. >>> 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. >> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "sympy" group. >> To post to this group, send email to [email protected]. >> 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. > > -- > You received this message because you are subscribed to the Google Groups > "sympy" group. > To post to this group, send email to [email protected]. > 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. > -- You received this message because you are subscribed to the Google Groups "sympy" group. To post to this group, send email to [email protected]. 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.
