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
--
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+un...@googlegroups.com.
To post to this group, send email to sy...@googlegroups.com.
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.
To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/CAJ8oX-EHZXbd5aFFNRy7gJ0hcydpAsG2qxv7Py65DQ9cA9VUUA%40mail.gmail.com.
--
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 sympy+un...@googlegroups.com.
To post to this group, send email to sy...@googlegroups.com.
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.
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.
To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/CAP7f1AjcHrsopXjwK5uYdALeSrokxLMwA7xebTikHyhwL-%2BOVg%40mail.gmail.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/CAJ2L7me73iJmkWm%3D_LiyWrsuOCZm%2B4OZbqD%2BkwwScWWx23HVdg%40mail.gmail.com.
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.
To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/6cfe63df-df00-4c36-a88a-6c477becc924%40googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/CAKgW%3D6KdCQso6Nobdfeduyu395n-R5VjutEiGiZesTLL17siLA%40mail.gmail.com.
.
an email to sympy+unsubscribe@googlegroups.com.
To post to this group, send email to sy...@googlegroups.com.
Visit this group at http://groups.google.com/group/sympy.
To view this discussion on the web visit
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 sympy+unsubscribe@googlegroups.com.
To post to this group, send email to sy...@googlegroups.com.
Visit this group at http://groups.google.com/group/sympy.
To view this discussion on the web visit
.
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
To post to this group, send email to sy...@googlegroups.com.
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
.
--
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+unsubscribe@googlegroups.com.
To post to this group, send email to sy...@googlegroups.com.
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.
--
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 sympy+unsubscribe@googlegroups.com.
To post to this group, send email to sy...@googlegroups.com.
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.
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.
I prefer either to pass -ffast-math flag (setting compiler flags is already an issue since we need
to indicate optimization level, right?) or write a specialized callback to be inlined (tuned to an Intel i7):
To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/8ad9fbf6-144b-44e7-a55c-47e065ee6853%40googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/CAJ2L7mf3C0fB8Y5ynUxDui%3DOZBVyVPGdwK_NEWJqyfKzGSwizw%40mail.gmail.com.
That being said, we do that in Theano. Putting a limit on the exponent that you do that would allow to don't loose too much precission for big exponent.
I do like the specialized function idea, as it can easily be done using our current framework. Instead of linking to pow in math.h by default for integer exponents, we can use a specialized integer exponent function that is printed by the codeprinter (separate header file? In the header file? In the .c file? Not sure the best spot). This way the user can override our default as they normally would, and requires no additional kwargs. If pow is overridden by the user, it will not be included in the code printout. Easy, simple, and requires no user facing changes.
I agree that it's a good idea. I guess a single header which is included is easiest to start with?
Should the functions be implemented in C? or C and Fortran? Or C++ even?
Are there any other functions except pow that needs special implementation?
Can you point me to some examples from your experience when
-ffast-math may result in loss of precision? I use it all the time in
all my production codes. So I would like to learn more about the
pitfalls.
This option should never be turned on by any -O option since it can result in incorrect output for programs which depend on an exact implementation of IEEE or ISO rules/specifications for math functions.
/.../ Handling compiler options should definitely be added to the codewrappers though, but should be a separate issue.
Adding to the already created header sounds fine, although it may be unexpected. Right now I'm kind of leaning to the creation and inclusion of a separate header-only library that includes SymPy's specially defined functions.