Thanks. That's very helpful.

Chenjie

On Sat, Oct 23, 2010 at 12:19 PM, Aaron S. Meurer <[email protected]>wrote:

> Well, I can't get it to give the different results myself, but I can tell
> you why that sort of thing happens in general.  The reason is that somewhere
> in the computation, it is using a dictionary or a set to store terms, and
> then it is iterating through it.  The problem is that, in Python,
> dictionaries and sets are unordered sequences, and their iteration order can
> basically be any order (nothing is guaranteed).  I have actually seen
> occurrences of list(set_a) giving one thing in an execution and then
> list(set_a) giving another ordering just a few lines down.
>
> So non-determinism in match() is just one thing that you are going to have
> to deal with.  Now, the best way to deal with it in this case is to do like
> the other people on this thread have said, and use a different method from
> match to solve your problem (I really don't think match was designed to
> solve your problem).  If that method isn't working completely for you, post
> a fuller example here and we can see how to fix it.
>
> In other cases, the best thing to do is to use the exclude keyword to Wild
> to force the match to have only one possible output.  As a simple example,
>
> p = Wild('p')
> q = Wild('q')
>
> (x*f(x)).match(p*q)
>
> has four possible outputs:
>
> {p:1, q:x*f(x)}
> {p:x, q:f(x)}
> {p:f(x), q:x}
> {p:x*f(x), q:1}
>
> But if you change it to
>
> p = Wild('p', exclude=[f(x)])
> q = Wild('q', exclude=[1])
>
> (x*f(x)).match(p*q)
>
> Then there is only one possible match, which is
>
> {p:x, q:f(x)}
>
> Finally, I want to point out that if you run powsimp() on the results of
> your "wrong" match, that it will work for you then (I think somewhere the
> match() algorithm is expecting those terms to cancel).
>
> Aaron Meurer
>
>
> On Oct 23, 2010, at 10:43 AM, Chenjie Gu wrote:
>
>
>
> On Sat, Oct 23, 2010 at 3:33 AM, Chris Smith <[email protected]> wrote:
>
>> Chenjie Gu wrote:
>> >>> Yes to both. I wrote up my notes when trying to understand what was
>> >>> going on here in Issue 1601:
>> >>>
>> >>> http://code.google.com/p/sympy/issues/detail?id=1601
>> >>>
>> >>> Chris,
>> >>
>> >> I just went through the above link.
>> >> In any case, I think what you described is a "deterministic"
>> >> algorithm,
>> >> right?
>> >> What I feel confused is that it gives "random" results in different
>> >> runs. (on the same machine)
>> >> Would you explain why that's the case?
>> >>
>>
>> If you show some code showing that result perhaps that would help.
>> Otherwise, I can't imagine why equivalent expressions would give different
>> result. But note: the ordering of the args matters, so if variable names or
>> any other such thing change the ordering of terms then that will change the
>> match behavior IIRC.
>>
>> One example is the script in the first post:
>
> x0 = Symbol('x0')
> x1 = Symbol('x1')
>
> p = Wild('p', exclude=[0])
> q = Wild('q', exclude=[0])
> r = Wild('r')
>
> y = exp(40*x0) - exp(-40*x1 + 40*x0)
> print y.match(p*q+r)
>
> I ran exactly the same script for multiple times, but different results
> were obtained for different runs.
>
> Chenjie
>
>
>> --
>> 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] <sympy%[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] <sympy%[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.

Reply via email to