Hi Jonathan! On Wed, 5 Oct 2005, Jonathan Brandmeyer wrote:
On Mon, 2005-10-03 at 14:34 -0400, Jonathan Brandmeyer wrote:
I recently discovered that expressions like pow(x - y, 2) can normalize to pow(y - x, 2) if y compares less than x (according to the ex_is_less comparator).
Yes. Using your wonderful PyGiNaC frontend: rbk@wallace:~/projects/manydigits/src/warmup$ ./pyginac Python 2.3.5 (#2, Aug 30 2005, 15:50:26) [GCC 4.0.2 20050821 (prerelease) (Debian 4.0.1-6)] on linux2 Type "help", "copyright", "credits" or "license" for more information.
from ginac import * x = symbol("x") y = symbol("y") print normal((pow(x, 2) - pow(y, 2)) / pow(x-y, 3)) (y+x)*(-y+x)**(-2)
rbk@wallace:~/projects/manydigits/src/warmup$ ./pyginac Python 2.3.5 (#2, Aug 30 2005, 15:50:26) [GCC 4.0.2 20050821 (prerelease) (Debian 4.0.1-6)] on linux2 Type "help", "copyright", "credits" or "license" for more information.
from ginac import * a = symbol("a") x = symbol("x") y = symbol("y") print normal((pow(x, 2) - pow(y, 2)) / pow(x-y, 3)) (y-x)**(-2)*(y+x)
Try it a couple of times. You should observe that the output is completely deterministic. The only differens is the seemingly unrelated symbol a: it changes the serial number of the symbols x and y and, hence, also affects canonical ordering. In your test suite: maybe you should not check e against d, but instead normal(e-d) against 0, or normal(e/d) against 1?
At this point all I can say is "sometimes", since it has been observed to occur even when x compares greater than y.
Is this behavior deliberate? A particular test in the test suite (check/exam_normalization.cpp) normally only passes when pow(x - y, 2).normal() == pow(x-y, 2).
Also, please see the comment of the function randomify_symbol_serials ginac/check/times.cpp for an idea how a deterministic program can presumably by non-deterministic: does the number of symbols generated before that test change in your test? Regards -richy. -- Richard B. Kreckel <http://www.ginac.de/~kreckel/>