Hi,

ok, if cython is a wrapper to manually done c code, then Theano is the
faster automatic code regenrator at run time :)

Under linux, mac, the easiest way to change theano flags is via the
command line under bash:

THEANO_FLAGS=linker=c python benchmark.py

would do the trick.

This only work when all operation in Theano have c code. If one of
them have only python code, it won't work.

Fred

On Thu, Dec 19, 2013 at 5:54 PM, Jason Moore <[email protected]> wrote:
> Fred,
>
> The Cython code I have is a simple wrapper to a C file I generate that looks
> like this, but of course with much longer expressions:
>
> https://github.com/PythonDynamics/pydy-code-gen/blob/master/pydy_code_gen/tests/expected_cython/desired_mass_forcing_c.c
>
> The Cython wrapper is like this:
>
> https://github.com/PythonDynamics/pydy-code-gen/blob/master/pydy_code_gen/tests/expected_cython/desired_mass_forcing.pyx
>
> Where do you specify the "linker=c" flag?
>
>
> Jason
> moorepants.info
> +01 530-601-9791
>
>
> On Thu, Dec 19, 2013 at 3:46 PM, Frédéric Bastien <[email protected]> wrote:
>>
>> Hi,
>>
>> This is just to note that I did some optimization in Theano related to
>> this. I did "easy" stuff, like adding c code to some "trivial" op that
>> where bottleneck in our cases.
>>
>> It is still slower then your cython example. Is it manually done
>> cython or generated cython?
>>
>> Also, I fixed a crash due to the extra not used input to the theano
>> function. If you use the linker=c Theano flag, with the development
>> version of Theano. It will run faster then with the current config.
>>
>> thanks for the benchmark, it make it easy to see where is the
>> bottleneck in Theano for you case.
>>
>> Fred
>>
>> On Tue, Nov 5, 2013 at 9:46 PM, Jason Moore <[email protected]> wrote:
>> > Sure, I'll do some benchmarks on that soon.
>> >
>> >
>> > Jason
>> > moorepants.info
>> > +01 530-601-9791
>> >
>> >
>> > On Tue, Nov 5, 2013 at 9:27 PM, Aaron S. Meurer <[email protected]>
>> > wrote:
>> >>
>> >> Assumedly if it doesn't, then you would be able to tell just by
>> >> applying
>> >> the sympy cse and seeing if it makes a significant difference in the
>> >> run
>> >> time.
>> >>
>> >> Aaron Meurer
>> >>
>> >> On Nov 5, 2013, at 6:45 PM, Matthew Rocklin <[email protected]> wrote:
>> >>
>> >> Sadly I'm not an expert in C compilers and I no longer have an awesome
>> >> compilers-post-doc-office-mate.  I don't know what they'll do in this
>> >> situation.  His no-CSE statement would still hold if the input pointers
>> >> point to dynamically allocated memory.  I don't recall what he said if
>> >> they
>> >> point to statically allocated memory; I think it was a big nebulous "it
>> >> depends."
>> >>
>> >>
>> >> On Tue, Nov 5, 2013 at 5:35 PM, Jason Moore <[email protected]>
>> >> wrote:
>> >>>
>> >>> 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.
>> >>
>> >>
>> >> --
>> >> 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