For handling Pow? horner(x**11) results in x**11. Or were you recommending applying horner to an entire expression tree?
On Fri, Aug 29, 2014 at 3:55 PM, Tim Lahey <[email protected]> wrote: > I recommend that you use the horner function in polys. > > > On 29 Aug 2014, at 16:48, James Crist wrote: > > If I understand correctly, there is no cost in representing pow(x, n) as >> x*x*x*x... for any positive integer n, as long as it's done correctly. C >> compilers don't like to change how you write out calculations unless >> they're asked too. So x*x*x*x will not generate the same machine code as >> (x*x)*(x*x). The second case is preferable, as it will result in y = x*x, >> sol = y*y, rather than sol = x*x*x*x. This removes the need for one >> computation. Also, the second way apparently results in better precision >> for the end result (not sure why). >> >> I am all for writing all positive integer powers as multiplication, >> provided we can get the parenthesis convention correct. So x**4 -> >> (x*x)*(x*x), or x**11 -> x*((x*x)*(x*x)*x)*((x*x)*(x*x)*x), etc... If >> others are supportive of this, I'll submit a PR. >> >> >> On Fri, Aug 29, 2014 at 2:00 PM, Aaron Meurer <[email protected]> wrote: >> >> I think we should print pow using repeated multiplication. People >>> might not know about --ffast-math, not realize that we are using pow >>> and that it is needed, or not want other optimizations that it >>> provides. >>> >>> Is there a reason to put a limit on the power (5 was suggested here, >>> 10 on the pull request)? >>> >>> Aaron Meurer >>> >>> On Fri, Aug 29, 2014 at 9:38 AM, Jason Moore <[email protected]> >>> wrote: >>> >>>> Sorry, it wasn't merged. He found that the --fast-math flag in the >>>> >>> complier >>> >>>> takes care of this. >>>> >>>> >>>> Jason >>>> moorepants.info >>>> +01 530-601-9791 >>>> >>>> >>>> On Fri, Aug 29, 2014 at 10:37 AM, Jason Moore <[email protected]> >>>> >>> wrote: >>> >>>> >>>>> Here is some work on the pow issue: >>>>> https://github.com/sympy/sympy/pull/7519 >>>>> >>>>> Looks like it was merged so the ccode printer should print x*x*x... for >>>>> less that 10 x's. >>>>> >>>>> >>>>> Jason >>>>> moorepants.info >>>>> +01 530-601-9791 >>>>> >>>>> >>>>> On Fri, Aug 29, 2014 at 7:33 AM, Jason Moore <[email protected]> >>>>> >>>> wrote: >>> >>>> >>>>>> >>>>>> >>>>>> >>>>>> Jason >>>>>> moorepants.info >>>>>> +01 530-601-9791 >>>>>> >>>>>> >>>>>> On Fri, Aug 29, 2014 at 2:38 AM, James Crist <[email protected]> >>>>>> wrote: >>>>>> >>>>>>> >>>>>>> I was planning on going to bed, but ended up working on this instead. >>>>>>> >>>>>> I >>> >>>> have no self control... >>>>>>> >>>>>>> Anyway, I've uncovered some things: >>>>>>> >>>>>>> 1. Addition of the restrict keyword to tell the compiler we're not >>>>>>> aliasing offers marginal gains. Gain a couple microseconds here and >>>>>>> >>>>>> there. >>> >>>> This requires a c99 compiler, but it's 2014, everyone should have one >>>>>>> >>>>>> by >>> >>>> now. >>>>>>> >>>>>>> 2. Inlining the function call resulted in smaller gains than 1, but >>>>>>> still *slightly* measurable. I suspect that for larger expression >>>>>>> >>>>>> sizes this >>> >>>> will be negligible to none. >>>>>>> >>>>>>> 3. Here's the big one: For small powers, pow(c, n) is considerably >>>>>>> slower than c*c*c*c... Changing the ccode Pow handler to print all >>>>>>> >>>>>> pows less >>> >>>> than 5 (arbitrary number) out as multiplication I was able to >>>>>>> >>>>>> match/beat >>> >>>> (slightly) all of jason's benchmarks with the C + numpy ufuncs. >>>>>>> >>>>>> >>>>>> >>>>>> Oh yes! I knew that. In fact, I feel like I read in the current code >>>>>> somewhere. I forget, but that seems like a standard way we should be >>>>>> handling pows in C. Nice find! >>>>>> >>>>>> >>>>>>> >>>>>>> >>>>>>> On Thursday, August 28, 2014 1:38:30 PM UTC-5, Tim Lahey wrote: >>>>>>> >>>>>>>> >>>>>>>> On why Fortran is faster, Fortran semantics ensure that function >>>>>>>> arguments never alias, this allows the optimizer to make assumptions >>>>>>>> >>>>>>> about >>> >>>> the function and the arguments. This the main advantage of Fortran >>>>>>>> >>>>>>> over C. >>> >>>> But, because of this, it can lead to more memory usage. I know that >>>>>>>> >>>>>>> the >>> >>>> newer C++ standards have a keyword to mark arguments to indicate >>>>>>>> >>>>>>> that they >>> >>>> won't be aliased, but that requires that the code generator and the >>>>>>>> >>>>>>> compiler >>> >>>> support them. >>>>>>>> >>>>>>>> Cheers, >>>>>>>> >>>>>>>> Tim. >>>>>>>> >>>>>>>> On 2014-08-28, at 2:17 PM, Jason Moore <[email protected]> wrote: >>>>>>>> >>>>>>>> Jim and others, >>>>>>>>> >>>>>>>>> Here are the benchmarks I made yesterday: >>>>>>>>> >>>>>>>>> http://www.moorepants.info/blog/fast-matrix-eval.html >>>>>>>>> >>>>>>>>> The working code is here: >>>>>>>>> https://gist.github.com/moorepants/6ef8ab450252789a1411 >>>>>>>>> >>>>>>>>> Any feedback is welcome. >>>>>>>>> >>>>>>>>> >>>>>>>>> Jason >>>>>>>>> moorepants.info >>>>>>>>> +01 530-601-9791 >>>>>>>>> >>>>>>>>> >>>>>>>>> On Wed, Aug 27, 2014 at 11:44 PM, James Crist <[email protected]> >>>>>>>>> wrote: >>>>>>>>> I was wondering about that. I wasn't sure if the overhead from >>>>>>>>> looping through the inputs multiple times would outweigh >>>>>>>>> >>>>>>>> improvements from >>> >>>> fast C loops. Glad that in your case it does. >>>>>>>>> >>>>>>>>> I've thrown a WIP PR up: https://github.com/sympy/sympy/pull/7929 >>>>>>>>> >>>>>>>>> For some reason, creating the functions in python with numpy calls >>>>>>>>> still seems to be faster (for micro-benchmarks). This probably has >>>>>>>>> >>>>>>>> something >>> >>>> to do with function complexity (the example function above is >>>>>>>>> >>>>>>>> simple), but >>> >>>> I'd still think it'd be faster in pure C. I tried inlining the >>>>>>>>> >>>>>>>> call, which >>> >>>> was a small improvement, but it was still slower than the pure >>>>>>>>> >>>>>>>> numpy-python >>> >>>> version. Something to look into. >>>>>>>>> >>>>>>>>> >>>>>>>>> On Wed, Aug 27, 2014 at 10:28 PM, Jason Moore <[email protected]> >>>>>>>>> wrote: >>>>>>>>> Yeh, but if you simply create a ufunc for each expression in a >>>>>>>>> >>>>>>>> matrix >>> >>>> you still get substantial speedups. I wrote a bunch of test cases >>>>>>>>> >>>>>>>> that I'll >>> >>>> post to my blog tomorrow. >>>>>>>>> >>>>>>>>> >>>>>>>>> Jason >>>>>>>>> moorepants.info >>>>>>>>> +01 530-601-9791 >>>>>>>>> >>>>>>>>> >>>>>>>>> On Wed, Aug 27, 2014 at 11:26 PM, James Crist <[email protected]> >>>>>>>>> wrote: >>>>>>>>> Not yet. I wrote it this morning during an extremely boring >>>>>>>>> >>>>>>>> meeting, >>> >>>> and haven't had a chance to clean it up. This doesn't solve your >>>>>>>>> >>>>>>>> problem >>> >>>> about broadcasting a matrix calculation though... >>>>>>>>> >>>>>>>>> >>>>>>>>> On Wed, Aug 27, 2014 at 10:23 PM, Jason Moore <[email protected]> >>>>>>>>> wrote: >>>>>>>>> Awesome. I was working on this today but it looks like you've by >>>>>>>>> passed what I had working. Do you have a PR with this? >>>>>>>>> >>>>>>>>> >>>>>>>>> Jason >>>>>>>>> moorepants.info >>>>>>>>> +01 530-601-9791 >>>>>>>>> >>>>>>>>> >>>>>>>>> On Wed, Aug 27, 2014 at 11:11 PM, Matthew Rocklin < >>>>>>>>> >>>>>>>> [email protected]> >>> >>>> wrote: >>>>>>>>> Cool >>>>>>>>> >>>>>>>>> >>>>>>>>> On Wed, Aug 27, 2014 at 8:07 PM, James Crist <[email protected]> >>>>>>>>> >>>>>>>> wrote: >>> >>>> I still need to do some cleanups and add tests, but I finally have >>>>>>>>> this working and thought I'd share. I'm really happy with this: >>>>>>>>> >>>>>>>>> In [1]: from sympy import * >>>>>>>>> >>>>>>>>> In [2]: a, b, c = symbols('a, b, c') >>>>>>>>> >>>>>>>>> In [3]: expr = (sin(a) + sqrt(b)*c**2)/2 >>>>>>>>> >>>>>>>>> In [4]: from sympy.utilities.autowrap import ufuncify >>>>>>>>> >>>>>>>>> In [5]: func = ufuncify((a, b, c), expr) >>>>>>>>> >>>>>>>>> In [6]: func(1, 2, 3) >>>>>>>>> Out[6]: 6.7846965230828769 >>>>>>>>> >>>>>>>>> In [7]: func([1, 2, 3, 4, 5], [6, 7, 8, 9, 10], 3) >>>>>>>>> Out[7]: array([ 11.44343933, 12.36052961, 12.79848207, >>>>>>>>> 13.12159875, 13.75078733]) >>>>>>>>> >>>>>>>>> In [8]: from numpy import arange >>>>>>>>> >>>>>>>>> In [9]: a = arange(10).reshape((2, 5)) >>>>>>>>> >>>>>>>>> In [10]: c = arange(10, 20).reshape((2, 5)) >>>>>>>>> >>>>>>>>> In [11]: b = 25 >>>>>>>>> >>>>>>>>> In [12]: func(a, b, c) >>>>>>>>> Out[12]: >>>>>>>>> array([[ 250. , 302.92073549, 360.45464871, 422.57056 , >>>>>>>>> 489.62159875], >>>>>>>>> [ 562.02053786, 639.86029225, 722.8284933 , 810.49467912, >>>>>>>>> 902.70605924]]) >>>>>>>>> >>>>>>>>> In [13]: type(func) >>>>>>>>> Out[13]: numpy.ufunc >>>>>>>>> >>>>>>>>> This now does everything a numpy `ufunc` does normally, as it *is* >>>>>>>>> >>>>>>>> a >>> >>>> ufunc. Codegen is hooked up to numpy api. Type conversion and >>>>>>>>> >>>>>>>> broadcasting >>> >>>> are done automagically. >>>>>>>>> >>>>>>>>> Caveats: only functions with a single output are accepted (this >>>>>>>>> >>>>>>>> could >>> >>>> be changed to accept multi-output without much effort though). >>>>>>>>> >>>>>>>> Also, as with >>> >>>> all unfuncs, input/outputs must all be scalars (no matrix/Indexed >>>>>>>>> >>>>>>>> operations >>> >>>> allowed). >>>>>>>>> >>>>>>>>> -- >>>>>>>>> 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 [email protected]. >>>>>>>>> To post to this group, send email to [email protected]. >>>>>>>>> Visit this group at http://groups.google.com/group/sympy. >>>>>>>>> To view this discussion on the web visit >>>>>>>>> >>>>>>>>> https://groups.google.com/d/msgid/sympy/76e0fbbe-5ce4- >>> 43b7-855b-6ac821f6b8ae%40googlegroups.com >>> . >>> >>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> 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 [email protected]. >>>>>>>>> To post to this group, send email to [email protected]. >>>>>>>>> Visit this group at http://groups.google.com/group/sympy. >>>>>>>>> To view this discussion on the web visit >>>>>>>>> >>>>>>>>> https://groups.google.com/d/msgid/sympy/CAJ8oX- >>> EHZXbd5aFFNRy7gJ0hcydpAsG2qxv7Py65DQ9cA9VUUA%40mail.gmail.com >>> . >>> >>>> >>>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> You received this message because you are subscribed to a topic in >>>>>>>>> the Google Groups "sympy" group. >>>>>>>>> To unsubscribe from this topic, visit >>>>>>>>> https://groups.google.com/d/topic/sympy/azVZHLOv9Vc/unsubscribe. >>>>>>>>> To unsubscribe from this group and all its topics, send an email to >>>>>>>>> [email protected]. >>>>>>>>> >>>>>>>>> To post to this group, send email to [email protected]. >>>>>>>>> Visit this group at http://groups.google.com/group/sympy. >>>>>>>>> To view this discussion on the web visit >>>>>>>>> >>>>>>>>> https://groups.google.com/d/msgid/sympy/CAP7f1AieaeoOFtc_ >>> S4XPxWOX2jr2zmda9VCRpWpzHMTGLkmHPQ%40mail.gmail.com >>> . >>> >>>> >>>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> 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 [email protected]. >>>>>>>>> To post to this group, send email to [email protected]. >>>>>>>>> Visit this group at http://groups.google.com/group/sympy. >>>>>>>>> To view this discussion on the web visit >>>>>>>>> >>>>>>>>> https://groups.google.com/d/msgid/sympy/CAJ2L7mfL_xO%3DO- >>> ZRMx-zfpZzJKJ-%2BUdTzSCz5jYf%2B%3DdovR%2B_7Q%40mail.gmail.com >>> >>> . >>> >>>> >>>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> You received this message because you are subscribed to a topic in >>>>>>>>> the Google Groups "sympy" group. >>>>>>>>> To unsubscribe from this topic, visit >>>>>>>>> https://groups.google.com/d/topic/sympy/azVZHLOv9Vc/unsubscribe. >>>>>>>>> To unsubscribe from this group and all its topics, send an email to >>>>>>>>> [email protected]. >>>>>>>>> To post to this group, send email to [email protected]. >>>>>>>>> Visit this group at http://groups.google.com/group/sympy. >>>>>>>>> To view this discussion on the web visit >>>>>>>>> >>>>>>>>> https://groups.google.com/d/msgid/sympy/ >>> CAP7f1AjcHrsopXjwK5uYdALeSrokxLMwA7xebTikHyhwL-%2BOVg%40mail.gmail.com >>> >>> . >>> >>>> >>>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> 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 [email protected]. >>>>>>>>> To post to this group, send email to [email protected]. >>>>>>>>> Visit this group at http://groups.google.com/group/sympy. >>>>>>>>> To view this discussion on the web visit >>>>>>>>> >>>>>>>>> https://groups.google.com/d/msgid/sympy/CAJ2L7me73iJmkWm% >>> 3D_LiyWrsuOCZm%2B4OZbqD%2BkwwScWWx23HVdg%40mail.gmail.com >>> >>> . >>> >>>> >>>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> 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 [email protected]. >>>>>>>>> To post to this group, send email to [email protected]. >>>>>>>>> Visit this group at http://groups.google.com/group/sympy. >>>>>>>>> To view this discussion on the web visit >>>>>>>>> >>>>>>>>> https://groups.google.com/d/msgid/sympy/CAP7f1Agdi_X-o0B% >>> 2B9mH2CGOSN-TyYGVwgZm4q8%3DYwxieBzZkzA%40mail.gmail.com >>> >>> . >>> >>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>> 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 [email protected]. >>>>>>> To post to this group, send email to [email protected]. >>>>>>> Visit this group at http://groups.google.com/group/sympy. >>>>>>> To view this discussion on the web visit >>>>>>> >>>>>>> https://groups.google.com/d/msgid/sympy/6cfe63df-df00- >>> 4c36-a88a-6c477becc924%40googlegroups.com >>> . >>> >>>> >>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>> >>>>>> >>>>>> >>>>>> >>>>> >>>> -- >>>> 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 [email protected]. >>>> To post to this group, send email to [email protected]. >>>> Visit this group at http://groups.google.com/group/sympy. >>>> To view this discussion on the web visit >>>> >>>> https://groups.google.com/d/msgid/sympy/CAP7f1AhNvQAwJ3V8y7uvSb2nDTpKD >>> d8u8eiKVmjkOT-JZX4S2w%40mail.gmail.com >>> >>> . >>> >>>> >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> -- >>> You received this message because you are subscribed to a topic in the >>> Google Groups "sympy" group. >>> To unsubscribe from this topic, visit >>> https://groups.google.com/d/topic/sympy/azVZHLOv9Vc/unsubscribe. >>> To unsubscribe from this group and all its topics, send an email to >>> [email protected]. >>> To post to this group, send email to [email protected]. >>> Visit this group at http://groups.google.com/group/sympy. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/sympy/CAKgW%3D6KdCQso6Nobdfeduyu395n- >>> R5VjutEiGiZesTLL17siLA%40mail.gmail.com >>> . >>> For more options, visit https://groups.google.com/d/optout. >>> >>> >> -- >> 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 [email protected]. >> To post to this group, send email to [email protected]. >> Visit this group at http://groups.google.com/group/sympy. >> To view this discussion on the web visit https://groups.google.com/d/ >> msgid/sympy/CAJ2L7mf3C0fB8Y5ynUxDui%3DOZBVyVPGdwK_NEWJqyfKzGSwizw% >> 40mail.gmail.com. >> >> For more options, visit https://groups.google.com/d/optout. >> > > -- > You received this message because you are subscribed to a topic in the > Google Groups "sympy" group. > To unsubscribe from this topic, visit https://groups.google.com/d/ > topic/sympy/azVZHLOv9Vc/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/sympy. > To view this discussion on the web visit https://groups.google.com/d/ > msgid/sympy/9F9BC8F8-9C20-4623-A880-BA3E1DACE116%40gmail.com. > > For more options, visit https://groups.google.com/d/optout. > -- 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 [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/sympy. To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/CAJ2L7meCyqxdLgi7cZ%3D4pnbUPstwne5HwVtAvttY3mVGhzppCw%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
