Got it.

SymPy's code generators in codegen and autowrap don't support evaluating a
SymPy matrix as the expression. I'd like to improve those so that you can
pass in a sequences of Matrices and it returns a function that evaluates
all of the matrices in a single C/Fortran/etc file.

Here is a simple example of the c file I'm generating from two SymPy
matrices:
https://github.com/PythonDynamics/pydy-code-gen/blob/master/pydy_code_gen/tests/expected_cython/desired_mass_forcing_c.c


Jason
moorepants.info
+01 530-601-9791


On Tue, Nov 5, 2013 at 5:41 PM, Matthew Rocklin <[email protected]> wrote:

> My previous statement was that Theano won over autowrap.ufuncify because
> theano did CSE internally (theano's basic data structure is a DAG).
>
> My understanding is that your C friend is correct IF the code is written
> in the standard way, declaring each variable individually.  I remember
> looking at older code of your groups in which all of the variables were
> stored in a dynamically allocated array.  My C friend mentioned that most
> compilers won't dare touch such a structure because it's verify that
> transformations are safe.  I have no idea what your various code generators
> are doing under the hood.
>
> By the way I did not intend to raise the issue of CSE.  I'm mostly curious
> about the poor performance of Theano and I don't think this is that issue.
>
>
> On Tue, Nov 5, 2013 at 10:48 AM, Aaron Meurer <[email protected]> wrote:
>
>> I would still benchmark running cse and not. If cse() is fast enough,
>> it might out-balance the overhead of the code generation, especially
>> if it significantly reduces the resulting code size.
>>
>> Aaron Meurer
>>
>> On Tue, Nov 5, 2013 at 11:36 AM, Jason Moore <[email protected]>
>> wrote:
>> > My roommate who's a C guy suggested that CSE was a waste of time if you
>> have
>> > a good compiler. He claimed that the compiler will do CSE anyways, so
>> doing
>> > it in the C code was not useful. I need to compare my Cython code output
>> > with and without CSE (it currently uses CSE).
>> >
>> > How would I use CSE with theano_function? I'm not doing that currently
>> and
>> > it wasn't apparent to me how to go about that.
>> >
>> >
>> > Jason
>> > moorepants.info
>> > +01 530-601-9791
>> >
>> >
>> > On Tue, Nov 5, 2013 at 1:30 PM, Matthew Rocklin <[email protected]>
>> wrote:
>> >>
>> >> In my experiments with sympy-theano earlier this year I found that it
>> was
>> >> competitive with our Fortran code generation (autowrap.ufuncify) on
>> single
>> >> array outputs and outperformed it when CSE were involved.  I don't have
>> >> anything recorded that profiles scalar operations.
>> >>
>> >> Frederic might have some intuition on Theano's performance on large
>> scalar
>> >> computations.  I've brought this up in the past and don't actually
>> remember
>> >> the answer.
>> >>
>> >>
>> >> On Tue, Nov 5, 2013 at 9:51 AM, Jason Moore <[email protected]>
>> wrote:
>> >>>
>> >>> Ok, so I think I'm comparing things correctly then. It is surprising
>> that
>> >>> the compiled Theano code doesn't seem to execute that fast. The
>> functions
>> >>> I'm generating are essentially evaluating very long sympy
>> expressions, maybe
>> >>> Theano isn't great at that...
>> >>>
>> >>>
>> >>> Jason
>> >>> moorepants.info
>> >>> +01 530-601-9791
>> >>>
>> >>>
>> >>> On Tue, Nov 5, 2013 at 12:48 PM, Matthew Rocklin <[email protected]>
>> >>> wrote:
>> >>>>
>> >>>> `sympy.printing.theanocode.theano_function` calls `theano.function`
>> >>>>
>> >>>> The result of `theano_function` is a compiled theano function.
>> >>>>
>> >>>>
>> >>>>
>> >>>> On Tue, Nov 5, 2013 at 9:27 AM, Jason Moore <[email protected]>
>> >>>> wrote:
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>>> Jason
>> >>>>> moorepants.info
>> >>>>> +01 530-601-9791
>> >>>>>
>> >>>>>
>> >>>>> On Tue, Nov 5, 2013 at 8:46 AM, Frédéric Bastien <[email protected]>
>> >>>>> wrote:
>> >>>>>>
>> >>>>>> Hi,
>> >>>>>>
>> >>>>>> Just to know, witch version of Theano did you used? I have speed
>> up a
>> >>>>>> little the optimization phase of the compilation and I have a PR
>> that
>> >>>>>> will optimize this more.
>> >>>>>
>> >>>>>
>> >>>>> I'm using the master branch of Theano as of last week.
>> >>>>>
>> >>>>>>
>> >>>>>>
>> >>>>>> Also, Theano cache the compilation of the c code. Where this
>> timming
>> >>>>>> done with a empty theano cache or a filled Theano cache? If you ran
>> >>>>>> the same benchmark multiple time on the same computer, only the
>> first
>> >>>>>> time Theano will compile the c code, the other time it will reuse
>> what
>> >>>>>> is in the cache.
>> >>>>>
>> >>>>>
>> >>>>> I time two things wrt to Theano:
>> >>>>>
>> >>>>> 1. The time it takes to call
>> sympy.printing.theanocode.theano_function
>> >>>>>
>> >>>>> and
>> >>>>>
>> >>>>> 2. The time it takes to call the function generated from 1.
>> >>>>>
>> >>>>> When does the Theano compilation happen? Is it in the call to
>> >>>>> theano_function or the first time I use the generated function?
>> >>>>>
>> >>>>> If it is the latter then my timing comparisons aren't really
>> comparing
>> >>>>> apples to apples.
>> >>>>>
>> >>>>>>
>> >>>>>>
>> >>>>>> thanks
>> >>>>>>
>> >>>>>> Frédéric
>> >>>>>>
>> >>>>>> On Sun, Nov 3, 2013 at 3:22 PM, Ronan Lamy <[email protected]>
>> >>>>>> wrote:
>> >>>>>> > Le 03/11/13 14:19, Jason Moore a écrit :
>> >>>>>> >
>> >>>>>> >> Ronan,
>> >>>>>> >>
>> >>>>>> >> Thanks for looking at the derivation code. We haven't ever
>> really
>> >>>>>> >> had
>> >>>>>> >> any review of it outside of our mechanical engineer group, so
>> this
>> >>>>>> >> very
>> >>>>>> >> helpful.
>> >>>>>> >>
>> >>>>>> >> I'll review your PR and look into the second two items.
>> >>>>>> >>
>> >>>>>> >> Why do you think the dictionary representation will be so much
>> >>>>>> >> faster?
>> >>>>>> >
>> >>>>>> >
>> >>>>>> > Using a dict would make Vector.__eq__ a lot less expensive, and
>> make
>> >>>>>> > canonicalisation (as currently done in Vector.__init__)
>> O(len(args))
>> >>>>>> > instead
>> >>>>>> > of O(len(args)**2).
>> >>>>>> >
>> >>>>>> > However, it seems that the main performance issue is that
>> >>>>>> > instantiating
>> >>>>>> > Matrix objects is expensive. Using a dict isn't strictly
>> required to
>> >>>>>> > solve
>> >>>>>> > this, but the structure I suggest would allow e.g. dot products
>> of
>> >>>>>> > vectors
>> >>>>>> > to be decomposed as combinations of multiplications of components
>> >>>>>> > and dot
>> >>>>>> > products of base vectors, which can be optimised or cached
>> >>>>>> > separately. There
>> >>>>>> > would be no need for intermediate Matrix objects.
>> >>>>>> >
>> >>>>>> >
>> >>>>>> >>
>> >>>>>> >> On Sat, Nov 2, 2013 at 10:11 PM, Ronan Lamy <
>> [email protected]
>> >>>>>> >> <mailto:[email protected]>> wrote:
>> >>>>>> >>
>> >>>>>> >>     Le 01/11/13 11:54, Jason Moore a écrit :
>> >>>>>> >>
>> >>>>>> >>         I've been tinkering with code generation for ODE's that
>> >>>>>> >>         sympy.physics.mechanics spits out and have some results:
>> >>>>>> >>
>> >>>>>> >>         http://www.moorepants.info/__blog/pydy-code-gen.html
>> >>>>>> >>
>> >>>>>> >>         <http://www.moorepants.info/blog/pydy-code-gen.html>
>> >>>>>> >>
>> >>>>>> >>         Several people have posted topics on this recently. We
>> need
>> >>>>>> >> to
>> >>>>>> >>         build in
>> >>>>>> >>         a code generator for solving ODE's into SymPy that would
>> >>>>>> >> play
>> >>>>>> >>         well with
>> >>>>>> >>         the codegen and autowrap modules. I think I can use this
>> >>>>>> >> code I
>> >>>>>> >>         wrote as
>> >>>>>> >>         a base to start working on that but would need some help
>> >>>>>> >>         generalizing it
>> >>>>>> >>         beyond our systems. Feedback is welcome.
>> >>>>>> >>
>> >>>>>> >>
>> >>>>>> >>     I've only looked at the derivation part, it's an interesting
>> >>>>>> >>     real-world(ish) benchmark for expression manipulation.
>> However,
>> >>>>>> >> it
>> >>>>>> >>     incurs a lot of avoidable overhead:
>> >>>>>> >>     * Extracting some loop constants out of their loops cuts
>> down
>> >>>>>> >> the
>> >>>>>> >>     run-time by 40%, cf.
>> https://github.com/sympy/__sympy/pull/2570
>> >>>>>> >>
>> >>>>>> >>     <https://github.com/sympy/sympy/pull/2570>
>> >>>>>> >>     * The creation of temporary objects by the Vector class
>> takes
>> >>>>>> >> up
>> >>>>>> >>     most of the run-time.
>> >>>>>> >>     * The internal representation of Vector objects seems
>> >>>>>> >> inefficient. I
>> >>>>>> >>     think it should be switched to a dict-based representation
>> as a
>> >>>>>> >>     linear combination of base vectors (e.g. using {I.x: l0,
>> B.y:
>> >>>>>> >> -l1}
>> >>>>>> >>     for l0 * I.x - l1 * B.y).
>> >>>>>> >>
>> >>>>>> >>
>> >>>>>> >>     --
>> >>>>>> >>     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
>> >>>>>> >>     <mailto:sympy%[email protected]>.
>> >>>>>> >>
>> >>>>>> >>     To post to this group, send email to [email protected]
>> >>>>>> >>     <mailto:[email protected]>.
>> >>>>>> >>     Visit this group at http://groups.google.com/__group/sympy
>> >>>>>> >>     <http://groups.google.com/group/sympy>.
>> >>>>>> >>     For more options, visit
>> >>>>>> >> https://groups.google.com/__groups/opt_out
>> >>>>>> >>     <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.
>> >>>>
>> >>>>
>> >>>> --
>> >>>> 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.
>>
>
>  --
> 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