May be you should let the the common expressions be and let your
compiler figure them out.

If the code doesn't uses branches, then you rest assured that gcc's
optimizers will remove pretty much every duplication.

On Tue, Mar 15, 2011 at 1:18 PM, Ondrej Certik <[email protected]> wrote:
> On Mon, Mar 14, 2011 at 10:24 PM, Chris Kees <[email protected]> wrote:
>> On Mon, Mar 14, 2011 at 10:40 PM, Ondrej Certik <[email protected]> wrote:
>>> Hi Chris,
>>>
>>> On Mon, Mar 14, 2011 at 9:08 AM, Chris Kees <[email protected]> wrote:
>>>> Hi,
>>>>
>>>> I'm new to the list and have done very little with symbolic math so
>>>> I'm hoping there is a simple way to do what I need to do. I have two
>>>> scalar functions f and g defined on the 6 dimensional space of
>>>> symmetric tensors. I need to calculate Df, Dg, and D^2 g and then
>>>> generate optimized C++ code to evaluate everything.  Df and Dg can be
>>>> stored as 6x1 matrices and D^2g as 6x6.   I wrote a simple script to
>>>> do that by building up the expressions for f and g and then calling
>>>> diff to build lists of the derivatives and then ccode to write
>>>> everything to an inline function. The problem is that the resulting
>>>> expressions are extremely large and my naive attempt at using the
>>>> simplify function crashed after using up all the memory on my machine
>>>> (8G).
>>>
>>> I run the scripts, and it takes quite a while to finish, so I would
>>> start with something manageable so that we can debug it. Would it make
>>> sense to let's say work with Df only for now and try to simplify it?
>>>
>>
>> Yes,  I will focus on Df for now.
>>
>>>>
>>>> The functions f and g are really just functions of the 3 tensor
>>>> invariants so if I were to do this by hand I'd build the gradient and
>>>> Hessian of each invariant and the gradient and Hessian of f and g and
>>>> then build Df, Dg, and D^2g by the chain rule.  That would catch a lot
>>>> of repeated subexpressions and a few more simplifications could be
>>>> identified due to the fact that the tensor invariants contain rational
>>>> and trigonometric functions that tend to be repeated in the
>>>> derivatives.  I doubt the hand generated code would be optimal though.
>>>> Does this seem like something the cse module or some of the other
>>>> specialized simplification support in sympy can handle? I'm pasting
>>>> the short python script in below.
>>>
>>> I think the cse() could do a good job, but if the expression is
>>> extremely large, it might be quite slow.
>>>
>>> Since you know what has to be done, another option is to do the chain
>>> rule "by hand" in sympy, and keep expressions in variables, so that it
>>> doesn't grow large.
>>>
>>> By saying, that the "hand generated code will not be optimal", which
>>> of these do you mean:
>>>
>>> 1) generating by hand (literally) would take months, thus will not be 
>>> optimal
>>> 2) generating by hand using sympy will be fast to implement, however,
>>> the resulting expressions will still be very complex and more
>>> simplification is needed
>>>
>>> and if you mean 2), what other simplifications should be done?
>>>
>>
>> I mean 2), the generated code will still not be optimal in that it
>> will still have a lot of common subexpressions. I ran cse on a list of
>> intermediate expressions used to build Df, and it pulled out 25
>> subexpressions, which is probably already beyond what I would do by
>> hand.  I will work on reorganizing the calculation to make the
>> expressions shorter.
>
> I see. Cool, keep us posted.
>
> Ondrej
>
> --
> 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.
>
>



-- 
Rohit Garg

http://rpg-314.blogspot.com/

-- 
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