On Sun, Jun 15, 2008 at 17:46, Ondrej Certik <[EMAIL PROTECTED]> wrote: > Anyway, I created an issue for this: > > http://code.google.com/p/sympy/issues/detail?id=891
I've attached some nominally working code to the issue. Playing with it, I see some suboptimal results. First, it's quadratic, but I'm not clever enough to think of a way around that. Second, sympy's default representation of expressions isn't well-suited for this algorithm (or the other way around). For example: In [1]: from cse import cse In [2]: cse((x-y)*(z-y) + sqrt((x-y)*(z-y))) Out[2]: ⎛ ⎽⎽⎽⎽ ⎽⎽⎽⎽⎞ ⎝[(x₀, -y), (x₁, x + x₀), (x₂, x₀ + z)], x₁*x₂ + ╲╱ x₁ *╲╱ x₂ ⎠ We see that -y gets picked up as term that should be pulled out although it only shows up in the context of (x-y). For the typical use case, subtraction is an atomic operation, and the representation of (x-y) as Add(Mul(NegativeOne(-1), Symbol('y')), Symbol('x')) gets in the way. Although the input expression has both x1 and x2 under the same sqrt(), it gets broken out before the cse() function gets to look at it. It would be nice to stuff everything in that term under the same sqrt() before cse() operates. This kind of thing pops up from time to time in my experience. So I think there needs to be a bit of a preprocessing step to optimize the expression specifically for cse() before it does its magic. Generalizing this to a list of expressions (e.g. my old use case) is an exercise left to the reader. -- Robert Kern "I have come to believe that the whole world is an enigma, a harmless enigma that is made terrible by our own mad attempt to interpret it as though it had an underlying truth." -- Umberto Eco --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---