On a longer-term note,

Will it be a problem to add another required ordering to Sympy? For
instance, I've found that Piecewise cannot wrap a Matrix expression, and
now Piecewise must be the outermost layer in an expression, forcing the
ordering of Matrix(Piecewise(other_stuff)). Again, this reflects
mathematical practice, so it's probably not a bad thing, but it doesn't
jive quite so well with programming practice, where users might expect
something that's a little less stringent.


On Tue, Oct 8, 2013 at 2:32 PM, Nathan Woods <[email protected]>wrote:

> I'm getting a compiler error using "gcc -c integrand.c".
>
> integrand.c: In function ‘integrand’:
> integrand.c:13:11: error: expected expression before ‘if’
>
> The generated C-code is :
>
>
> /******************************************************************************
>  *                      Code generated with sympy
> 0.7.2                       *
>  *
> *
>  *              See http://www.sympy.org/ for more
> information.               *
>  *
> *
>  *                       This file is part of
> 'project'                       *
>
>  
> ******************************************************************************/
> #include "integrand.h"
> #include <math.h>
>
> double integrand(double t, double x, double y) {
>
>    return if (x < 0.5) {
>
>       t*x*y + pow(x, 2) + pow(y, 2) + cos(t) - 1
>    }
>    else if (x >= 0.5) {
>       t*x*y + pow(x, 2) + pow(y, 2) + cos(t)
>    };
>
> }
>
>
>
> On Tue, Oct 8, 2013 at 2:25 PM, Nathan Woods <[email protected]>wrote:
>
>> That will actually work fine for my application, and it also more closely
>> approximates how piecewise functions are used in mathematics, which is a
>> plus. Let me test it out.
>>
>>
>> On Tue, Oct 8, 2013 at 2:24 PM, Ondřej Čertík <[email protected]>wrote:
>>
>>> Thanks Matthew!
>>>
>>> That's right. Nathan, let me know if this works for you:
>>>
>>> In [1]: e = t*x*y + x**2 + y**2 + Piecewise((0, x < 0.5), (1, x >=
>>> 0.5)) + cos(t) - 1
>>>
>>> In [2]: ccode(piecewise_fold(e))
>>> Out[2]: 'if (x < 0.5) {\n   t*x*y + pow(x, 2) + pow(y, 2) + cos(t) -
>>> 1\n}\nelse if (x >= 0.5) {\n   t*x*y + pow(x, 2) + pow(y, 2) +
>>> cos(t)\n}'
>>>
>>>
>>> Ondrej
>>>
>>> On Tue, Oct 8, 2013 at 2:20 PM, Matthew Rocklin <[email protected]>
>>> wrote:
>>> >  A simple fix would be to put the entire expression within the
>>> Piecewise.
>>> > E.g.
>>> >
>>> > Instead of
>>> >
>>> > x + Piecewise((0, x < 0), (1, x > 0))
>>> >
>>> > Try
>>> >
>>> > Piecewise((x, x < 0), (x + 1, x > 0))
>>> >
>>> > You shouldn't have to do this (ccodegen should be smart enough to
>>> handle
>>> > this), but I suspect it will work in the short term.
>>> >
>>> >
>>> > On Tue, Oct 8, 2013 at 1:07 PM, Nathan Woods <[email protected]>
>>> > wrote:
>>> >>
>>> >> I would be happy with either of the following implementations, one or
>>> the
>>> >> other of which might be preferred for other reasons. The immediate
>>> intended
>>> >> use is to wrap the resulting function in ctypes so that I can feed it
>>> to
>>> >> some existing code.
>>> >>
>>> >> - An if/then construct, like what you mentioned. I don't quite
>>> understand
>>> >> why that doesn't work, though.
>>> >> - 0 + (1-0)*(x>=0.5) (essentially a Heaviside implementation. C
>>> interprets
>>> >> a "false" as 0, and "true" as 1, correct?)
>>> >>
>>> >>
>>> >> On Tue, Oct 8, 2013 at 2:00 PM, Ondřej Čertík <
>>> [email protected]>
>>> >> wrote:
>>> >>>
>>> >>> On Tue, Oct 8, 2013 at 1:58 PM, Ondřej Čertík <
>>> [email protected]>
>>> >>> wrote:
>>> >>> > Nathan,
>>> >>> >
>>> >>> > I am working on a fix.
>>> >>> >
>>> >>> > Can you provide the exact C expression that you want Piecewise((0,
>>> x <
>>> >>> > 0.5), (1, x >= 0.5)) to generate?
>>> >>> > I.e. can you fill in the right hand side here:
>>> >>> >
>>> >>> >     assert ccode(Piecewise((0, x < 0.5), (1, x >= 0.5))) ==
>>> >>> > "piecewise(...)"
>>> >>>
>>> >>> Ok, it actually works... It produces:
>>> >>>
>>> >>> if (x < 0.5) {
>>> >>>    0
>>> >>> }
>>> >>> else if (x >= 0.5) {
>>> >>>    1
>>> >>> }
>>> >>>
>>> >>> But obviously this will not work inside an expression. Can you
>>> provide
>>> >>> us the exact C code that you expect
>>> >>> for your expression?
>>> >>>
>>> >>> Ondrej
>>> >>>
>>> >>> --
>>> >>> 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.
>>> >>> For more options, visit https://groups.google.com/groups/opt_out.
>>> >>
>>> >>
>>> >> --
>>> >> 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.
>>> >> For more options, visit https://groups.google.com/groups/opt_out.
>>> >
>>> >
>>> > --
>>> > 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.
>>> > For more options, visit https://groups.google.com/groups/opt_out.
>>>
>>> --
>>> 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.
>>> For more options, visit https://groups.google.com/groups/opt_out.
>>>
>>
>>
>

-- 
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.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to