On 04/30/2013 11:35 AM, Chris Smith wrote:
Well, I think it would be an abuse of subs to make it work with your autoupdating dictionary. If I understand mul_dict, it doesn't contain any entries at the start -- it becomes populated as you request ei*ej values. What about using Transform:

# a rule that all Muls get multiplied by 2

>>> m = {}  # the dictionary that keeps track of the rule
>>> (x+x*y+z*a).xreplace(Transform(lambda k: m.setdefault(k, 2*k), lambda w: w.is_Mul))
2*a*z + 2*x*y + x
>>> m
{x*y: 2*x*y, a*z: 2*a*z}

But that is not the right way to benefit from the dictionary since the argument to setdefault is called every time. Instead (and I verify by using the `ok` function that delays the number of seconds equal to its argument) this is how it should be done:

>>> def ok(i):
...  t=time()
...  while time()-t<i:pass
...  return i
...
>>> (3*x+3*x*y+3*z*a).xreplace(Transform(lambda k: m[k] if k in m else m.setdefault(k, ok(k)), lambda w: w.is_Integer))
3*a*z + 3*x*y + 3*x

That only takes 3 seconds to run, not 9.

/c
--
You received this message because you are subscribed to the Google Groups "sympy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sympy+unsubscr...@googlegroups.com.
To post to this group, send email to sympy@googlegroups.com.
Visit this group at http://groups.google.com/group/sympy?hl=en-US.
For more options, visit https://groups.google.com/groups/opt_out.


I found the docstring for Transform and understand it now. The only thing that would require work is the filter function in Transform. Mine would be "lambda w: product_bases(w)" where product_bases(w) is true if w is the product of two
non-commutative bases or the square of a non-commutative base.

--
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sympy+unsubscr...@googlegroups.com.
To post to this group, send email to sympy@googlegroups.com.
Visit this group at http://groups.google.com/group/sympy?hl=en-US.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to