If we structure the rules properly, it shouldn't be necessary to parse Python.

Aaron Meurer

On Tue, Mar 14, 2017 at 9:28 AM, Arihant Parsoya
<[email protected]> wrote:
> Hi Aaron,
>
> I think documentation of all the rules implemented is important(as mentioned
> by Ondrej). I was thinking to implement automatic documentation of rules in
> the decision tree using abstract syntax trees. AST automatically converts
> all `elif` and `else` conditions to `if`s. We can write a program which
> automatically generates documentation of rules with their conditions using
> AST. Is this a good idea?
>
> Thanks
>
> On Tuesday, March 14, 2017 at 12:39:31 AM UTC+5:30, Aaron Meurer wrote:
>>
>> Starting with Francesco's work is a good idea. He has thought about
>> pattern matching in SymPy more than anyone else.
>>
>> Aaron Meurer
>>
>> On Mon, Mar 13, 2017 at 2:48 PM, Abdullah Javed Nesar
>> <[email protected]> wrote:
>> > Hi,
>> >
>> > Thanks Aaron for your reply, that really helped. I think I've collected
>> > sufficient information about the project and I'll need your help to
>> > complete
>> > my proposal and organize tasks better.
>> >
>> > I think framing of rules is lengthy but quite straightforward. Pattern
>> > matching which needs to be implemented prior to it is where I need your
>> > help. I was looking at Francesco Bonazzi's proposal on new pattern
>> > matching
>> > and it seems fine to me. Do we need to add anything more to it or
>> > improve on
>> > anything? What do you think?
>> >
>> > Abdullah Javed Nesar
>> >
>> > On Saturday, March 11, 2017 at 2:46:19 AM UTC+5:30, Aaron Meurer wrote:
>> >>
>> >> I recommend using the method I outlined above to figure out which
>> >> algorithm is actually handling this. Or just run integrate() through a
>> >> debugger.
>> >>
>> >> For the pattern matching integrator, there is a discussion in another
>> >> thread here on how to make patterns match expressions that are
>> >> mathematically equivalent, but don't match exactly.
>> >>
>> >> Aaron Meurer
>> >>
>> >> On Fri, Mar 10, 2017 at 9:05 AM, Abdullah Javed Nesar
>> >> <[email protected]> wrote:
>> >> > Aaron in case like this,
>> >> >
>> >> >>>> integrate(E**(n*log(a+b*x)), x)
>> >> > ⎧⎩⎨1blog(ab+x)abn+benlog(a+bx)+bxbn+benlog(a+bx)forn=−1otherwise
>> >> > E**(n*log(a+b*x))should better be simplified to (a+b*x)**n to proceed
>> >> > further, can you tell me how SymPy currently handles such cases?
>> >> >
>> >> > Abdullah Javed Nesar
>> >> > On Thursday, March 9, 2017 at 11:54:32 PM UTC+5:30, Aaron Meurer
>> >> > wrote:
>> >> >>
>> >> >> Can you clarify what you mean by this?
>> >> >>
>> >> >> Aaron Meurer
>> >> >>
>> >> >> On Thu, Mar 9, 2017 at 1:14 PM Abdullah Javed Nesar
>> >> >> <[email protected]>
>> >> >> wrote:
>> >> >>>
>> >> >>> Hi,
>> >> >>>
>> >> >>> I am not able to figure out how exactly we will use replacement
>> >> >>> allowing
>> >> >>> technique in Rubi and when do we use it, can anyone explain this?
>> >> >>>
>> >> >>> Thanks.
>> >> >>>
>> >> >>>
>> >> >>> On Thursday, March 9, 2017 at 9:47:10 PM UTC+5:30, Abdullah Javed
>> >> >>> Nesar
>> >> >>> wrote:
>> >> >>>>
>> >> >>>> Hi,
>> >> >>>> Arihant thanks for those suggestions, I guess if rule name
>> >> >>>> contains
>> >> >>>> Algebraic then just
>> >> >>>>
>> >> >>>> >>> def rule_algebraic_integrand_1_1(expr, symbol)
>> >> >>>>
>> >> >>>> would suffice, no need for >>>def
>> >> >>>> rule_algebraic_integrand_1_1_1_1(expr,
>> >> >>>> symbol)  (indicating algebraic integrand>linear product>(a +
>> >> >>>> b*x)**m). Yes,
>> >> >>>> this way the functions would be named in a systematic way,
>> >> >>>> necessarily
>> >> >>>> supported by a docstring which would explain those rules in
>> >> >>>> details,
>> >> >>>> as
>> >> >>>> Aaron pointed.
>> >> >>>>
>> >> >>>> Pattern matching used in manualintegrate() is a simple one without
>> >> >>>> a
>> >> >>>> decision tree and hence less efficient. The tree for (a + b*x)**m
>> >> >>>> would be
>> >> >>>> better represented as
>> >> >>>>  Pow(Add(a, Mul(b, x)), m), well explained in #7748.
>> >> >>>>
>> >> >>>>
>> >> >>>> On Thursday, March 9, 2017 at 3:36:30 PM UTC+5:30, Arihant Parsoya
>> >> >>>> wrote:
>> >> >>>>>
>> >> >>>>> Thanks Aaron,
>> >> >>>>>
>> >> >>>>> I read the discussion to improve pattern matching algorithm. Can
>> >> >>>>> you
>> >> >>>>> give some information about which algorithm is currently being
>> >> >>>>> used
>> >> >>>>> for
>> >> >>>>> pattern matching?
>> >> >>>>>
>> >> >>>>> I have been testing `match()` to check if it works properly for
>> >> >>>>> complex
>> >> >>>>> expressions. It gives correct answer if we `exclude` the
>> >> >>>>> integration
>> >> >>>>> variable. However, there can be issues in matching expression
>> >> >>>>> when
>> >> >>>>> brackets
>> >> >>>>> are automatically evaluated by SymPy:
>> >> >>>>>
>> >> >>>>> >>> x, y, z, F, fx = symbols('x, y, z, F, fx')
>> >> >>>>>
>> >> >>>>> >>> a = Wild('a', exclude=[x])
>> >> >>>>>
>> >> >>>>> >>> b = Wild('b', exclude=[x])
>> >> >>>>>
>> >> >>>>> >>> c = Wild('c', exclude=[x])
>> >> >>>>>
>> >> >>>>> >>> d = Wild('d', exclude=[x])
>> >> >>>>>
>> >> >>>>> >>> e = Wild('e', exclude=[x])
>> >> >>>>>
>> >> >>>>> >>> f = Wild('f', exclude=[x])
>> >> >>>>>
>> >> >>>>> >>> g = Wild('g', exclude=[x])
>> >> >>>>>
>> >> >>>>> >>> p = Wild('p', exclude=[x])
>> >> >>>>>
>> >> >>>>> >>> n = Wild('n', exclude=[x])
>> >> >>>>>
>> >> >>>>> >>> m = Wild('m', exclude=[x])
>> >> >>>>>
>> >> >>>>> >>> expr = ((1 + 2*x)**3) * ((F**(4*(5 + fx)))**6) * (6 +
>> >> >>>>> >>> 7*(F**(4*(5 +
>> >> >>>>> >>> fx))))**8
>> >> >>>>>
>> >> >>>>> >>> pattern = ((c + d*x)**m) * ((F**(g*(e + fx)))**n) * (a +
>> >> >>>>> >>> b*(F**(g*(e + fx))))**p
>> >> >>>>>
>> >> >>>>> >>> pprint(pattern)
>> >> >>>>>
>> >> >>>>>                    p                         n
>> >> >>>>>
>> >> >>>>> ⎛ g⋅(fx + e)      ⎞           m ⎛ g⋅(fx + e)⎞
>> >> >>>>>
>> >> >>>>> ⎝F          ⋅b + a⎠ ⋅(x⋅d + c) ⋅⎝F          ⎠
>> >> >>>>>
>> >> >>>>> >>> pprint(expr)
>> >> >>>>>
>> >> >>>>>                                8
>> >> >>>>>
>> >> >>>>>  24⋅fx + 120 ⎛   4⋅fx + 20    ⎞           3
>> >> >>>>>
>> >> >>>>> F           ⋅⎝7⋅F          + 6⎠ ⋅(2⋅x + 1)
>> >> >>>>>
>> >> >>>>> >>> expr.match(pattern)
>> >> >>>>>
>> >> >>>>> {p_: 1, g_: 1, m_: 3, d_: 2, n_: 0, e_: 23*fx + 120, c_: 1, a_:
>> >> >>>>> 0,
>> >> >>>>> b_:
>> >> >>>>> (7*F**(4*fx + 20) + 6)**8}
>> >> >>>>>
>> >> >>>>>
>> >> >>>>> We need to find a way to convert the expresison into known
>> >> >>>>> standard
>> >> >>>>> form so pattern matching can be done peoperly or implement such
>> >> >>>>> functionality in `.match()` itself.
>> >> >>>>>
>> >> >>>>>
>> >> >>>>> Thanks
>> >> >>>>>
>> >> >>>>>
>> >> >>>>>
>> >> >>>>> On Thursday, March 9, 2017 at 12:16:41 AM UTC+5:30, Aaron Meurer
>> >> >>>>> wrote:
>> >> >>>>>>
>> >> >>>>>> That's sounds fine, though it should also include a docstring
>> >> >>>>>> that
>> >> >>>>>> lists the rule so we don't have to depend on the Rubi site. This
>> >> >>>>>> will also
>> >> >>>>>> let us generate some documentation on what rules are supported.
>> >> >>>>>>
>> >> >>>>>> We will likely want to extend the rules beyond what Rubi has
>> >> >>>>>> eventually, so we should also consider that.
>> >> >>>>>>
>> >> >>>>>> Aaron Meurer
>> >> >>>>>>
>> >> >>>>>> On Wed, Mar 8, 2017 at 12:07 PM Arihant Parsoya
>> >> >>>>>> <[email protected]>
>> >> >>>>>> wrote:
>> >> >>>>>>>
>> >> >>>>>>> Hi,
>> >> >>>>>>>
>> >> >>>>>>> I observed that rules in manualintegrate() are countable in
>> >> >>>>>>> number.
>> >> >>>>>>> While implementing ~7000 rules, naming each rule is also going
>> >> >>>>>>> to
>> >> >>>>>>> be a big
>> >> >>>>>>> issue. I was thinking, names should be given based on the
>> >> >>>>>>> serial
>> >> >>>>>>> number of
>> >> >>>>>>> the rule in Rubi website. For example algebric rules for linear
>> >> >>>>>>> products
>> >> >>>>>>> should be named as:
>> >> >>>>>>>
>> >> >>>>>>> >>> def rule_algebric_integrand_1_1_1_1(expr, symbol):
>> >> >>>>>>>
>> >> >>>>>>> ...     return log(expr)
>> >> >>>>>>>
>> >> >>>>>>>
>> >> >>>>>>> Using the above syntax for names of rules, we will be able to
>> >> >>>>>>> uniquely identify each rule. Is this desirable?
>> >> >>>>>>>
>> >> >>>>>>> Thanks,
>> >> >>>>>>> Arihant Parsoya
>> >> >>>>>>>
>> >> >>>>>>> On Monday, March 6, 2017 at 10:44:41 PM UTC+5:30, Abdullah
>> >> >>>>>>> Javed
>> >> >>>>>>> Nesar wrote:
>> >> >>>>>>>>
>> >> >>>>>>>> Hi,
>> >> >>>>>>>>
>> >> >>>>>>>> I was looking into sympy.integrals.manualintegrate.py it seems
>> >> >>>>>>>> that
>> >> >>>>>>>> the pattern matching (in manualintegrate) is quite different
>> >> >>>>>>>> from
>> >> >>>>>>>> what is
>> >> >>>>>>>> expected in Rubi. As PR #7748 mentions we'll be using a better
>> >> >>>>>>>> approach
>> >> >>>>>>>> using decision tree, can you elaborate on what is expected?
>> >> >>>>>>>> How
>> >> >>>>>>>> decision
>> >> >>>>>>>> tree concludes to a rule of integration then falls into
>> >> >>>>>>>> function
>> >> >>>>>>>> integrate()
>> >> >>>>>>>> which contains rules like 1.1.1 (a + b*x)**m?
>> >> >>>>>>>>
>> >> >>>>>>>> Abdullah Javed Nesar
>> >> >>>>>>>>
>> >> >>>>>>>> On Monday, March 6, 2017 at 2:59:38 AM UTC+5:30, Aaron Meurer
>> >> >>>>>>>> wrote:
>> >> >>>>>>>>>
>> >> >>>>>>>>> integrate() uses several algorithms, and one or more
>> >> >>>>>>>>> algorithms
>> >> >>>>>>>>> may
>> >> >>>>>>>>> apply to any specific integral. Some algorithms, if you know
>> >> >>>>>>>>> how
>> >> >>>>>>>>> they
>> >> >>>>>>>>> work, you can easily see if they won't apply to a specific
>> >> >>>>>>>>> integrand.
>> >> >>>>>>>>> The best way to tell how it works for a specific integral is
>> >> >>>>>>>>> to
>> >> >>>>>>>>> check
>> >> >>>>>>>>> the various algorithms. Another thing that I highly suggest
>> >> >>>>>>>>> is
>> >> >>>>>>>>> to
>> >> >>>>>>>>> run
>> >> >>>>>>>>> the integrate() function through a debugger, so you can see
>> >> >>>>>>>>> how
>> >> >>>>>>>>> it
>> >> >>>>>>>>> works (I like PuDB, but any debugger that you are comfortable
>> >> >>>>>>>>> with
>> >> >>>>>>>>> will work).
>> >> >>>>>>>>>
>> >> >>>>>>>>> Here are the algorithms used by integrate() (I hope I didn't
>> >> >>>>>>>>> forget
>> >> >>>>>>>>> any).  You can import each algorithm from the specified
>> >> >>>>>>>>> module
>> >> >>>>>>>>> to
>> >> >>>>>>>>> try
>> >> >>>>>>>>> it
>> >> >>>>>>>>>
>> >> >>>>>>>>> sympy.integrals.risch.risch_integrate() - Risch algorithm.
>> >> >>>>>>>>> Currently
>> >> >>>>>>>>> only works for transcendental equations with exp() and log().
>> >> >>>>>>>>>
>> >> >>>>>>>>> sympy.integrals.manualintegrate.manualintegrate() - Manual
>> >> >>>>>>>>> integration. That means, integration akin to how you would do
>> >> >>>>>>>>> things
>> >> >>>>>>>>> by hand. This is very similar to Rubi in that it does pattern
>> >> >>>>>>>>> matching
>> >> >>>>>>>>> against some rules. Ideally any implementation of Rubi would
>> >> >>>>>>>>> merge
>> >> >>>>>>>>> with manualintegrate() so we don't have two pattern matching
>> >> >>>>>>>>> integrators.
>> >> >>>>>>>>>
>> >> >>>>>>>>> sympy.integrals.trigonometry.trigintegrate() - Integrate trig
>> >> >>>>>>>>> functions. Also uses pattern matching.
>> >> >>>>>>>>>
>> >> >>>>>>>>> sympy.integrals.rationaltools.ratint() - Integrate rational
>> >> >>>>>>>>> functions.
>> >> >>>>>>>>>
>> >> >>>>>>>>> sympy.integrals.meijerint.meijerg_definite() and
>> >> >>>>>>>>> sympy.integrals.meijerint.meijerg_indefinite() - Integration
>> >> >>>>>>>>> using
>> >> >>>>>>>>> the
>> >> >>>>>>>>> Meijer G algorithm (roughly, by translating the integral to a
>> >> >>>>>>>>> Meijer
>> >> >>>>>>>>> G-function, integrating, then translating back).
>> >> >>>>>>>>>
>> >> >>>>>>>>> sympy.integrals.heurisch.heurisch() - The heuristic Risch
>> >> >>>>>>>>> algorithm.
>> >> >>>>>>>>> This is tried last, because it can be very slow (sometimes
>> >> >>>>>>>>> hanging
>> >> >>>>>>>>> the
>> >> >>>>>>>>> integrator), but there are cases where only it can produce an
>> >> >>>>>>>>> answer.
>> >> >>>>>>>>>
>> >> >>>>>>>>> You should be able to apply any of these functions directly
>> >> >>>>>>>>> on
>> >> >>>>>>>>> an
>> >> >>>>>>>>> integrand to see if they can produce an answer.
>> >> >>>>>>>>>
>> >> >>>>>>>>> The algorithms are tried in order until one gives an answer.
>> >> >>>>>>>>> I
>> >> >>>>>>>>> don't
>> >> >>>>>>>>> remember exactly what order, but I think it's similar to the
>> >> >>>>>>>>> above.
>> >> >>>>>>>>> I
>> >> >>>>>>>>> do know that heurisch() is last, because it's the worst.
>> >> >>>>>>>>>
>> >> >>>>>>>>> Aaron Meurer
>> >> >>>>>>>>>
>> >> >>>>>>>>>
>> >> >>>>>>>>> On Sun, Mar 5, 2017 at 12:00 PM, Abdullah Javed Nesar
>> >> >>>>>>>>> <[email protected]> wrote:
>> >> >>>>>>>>> > Hi Aaron,
>> >> >>>>>>>>> >
>> >> >>>>>>>>> > Thanks for your explanation.
>> >> >>>>>>>>> >
>> >> >>>>>>>>> > How does SymPy evaluates integrals like,
>> >> >>>>>>>>> >
>> >> >>>>>>>>> >>>integrate((a + b*u)**m, x) when u = c + dx  (i.e.
>> >> >>>>>>>>> >>> Integration
>> >> >>>>>>>>> >>> by
>> >> >>>>>>>>> >>> substitution)
>> >> >>>>>>>>> >
>> >> >>>>>>>>> > I couldn't find such an example can give one?
>> >> >>>>>>>>> >
>> >> >>>>>>>>> > Abdullah Javed Nesar
>> >> >>>>>>>>> >
>> >> >>>>>>>>> > On Sunday, March 5, 2017 at 11:58:20 AM UTC+5:30, Aaron
>> >> >>>>>>>>> > Meurer
>> >> >>>>>>>>> > wrote:
>> >> >>>>>>>>> >>
>> >> >>>>>>>>> >> The SymPy assumptions system lets you define x =
>> >> >>>>>>>>> >> Symbol('x',
>> >> >>>>>>>>> >> positive=True) (and query like x.is_positive). The pattern
>> >> >>>>>>>>> >> matcher
>> >> >>>>>>>>> >> will need to be able to set and define restrictions like
>> >> >>>>>>>>> >> this.
>> >> >>>>>>>>> >> Also
>> >> >>>>>>>>> >> note that expand_log() and logcombine() already expand and
>> >> >>>>>>>>> >> combine
>> >> >>>>>>>>> >> logarithms and check the domain restrictions.
>> >> >>>>>>>>> >>
>> >> >>>>>>>>> >> Another thing is that the integrator should return a
>> >> >>>>>>>>> >> Piecewise
>> >> >>>>>>>>> >> whenever possible. For example, the current integrator:
>> >> >>>>>>>>> >>
>> >> >>>>>>>>> >> In [6]: integrate(x**n, x)
>> >> >>>>>>>>> >> Out[6]:
>> >> >>>>>>>>> >> ⎧log(x)  for n = -1
>> >> >>>>>>>>> >> ⎪
>> >> >>>>>>>>> >> ⎪ n + 1
>> >> >>>>>>>>> >> ⎨x
>> >> >>>>>>>>> >> ⎪──────  otherwise
>> >> >>>>>>>>> >> ⎪n + 1
>> >> >>>>>>>>> >> ⎩
>> >> >>>>>>>>> >>
>> >> >>>>>>>>> >> This way we get results that are mathematically correct,
>> >> >>>>>>>>> >> even
>> >> >>>>>>>>> >> when
>> >> >>>>>>>>> >> assumptions aren't set.
>> >> >>>>>>>>> >>
>> >> >>>>>>>>> >> Aaron Meurer
>> >> >>>>>>>>> >>
>> >> >>>>>>>>> >> On Thu, Mar 2, 2017 at 8:56 AM, Abdullah Javed Nesar
>> >> >>>>>>>>> >> <[email protected]> wrote:
>> >> >>>>>>>>> >> > Hi Ondřej,
>> >> >>>>>>>>> >> >
>> >> >>>>>>>>> >> > I am willing to work on Rubi Integrator this summer. I
>> >> >>>>>>>>> >> > went
>> >> >>>>>>>>> >> > through the
>> >> >>>>>>>>> >> > issues you raised for this project and this idea really
>> >> >>>>>>>>> >> > sounds
>> >> >>>>>>>>> >> > cool. It
>> >> >>>>>>>>> >> > would be great to segregate the different methods of
>> >> >>>>>>>>> >> > integration into a
>> >> >>>>>>>>> >> > decision tree which would hence improve its performance.
>> >> >>>>>>>>> >> >
>> >> >>>>>>>>> >> > Before implementing Rule-based integrator we need to
>> >> >>>>>>>>> >> > implement
>> >> >>>>>>>>> >> > fast
>> >> >>>>>>>>> >> > pattern
>> >> >>>>>>>>> >> > matching/replacement for the set of 10,000 rules so we
>> >> >>>>>>>>> >> > need
>> >> >>>>>>>>> >> > to
>> >> >>>>>>>>> >> > plan out
>> >> >>>>>>>>> >> > an
>> >> >>>>>>>>> >> > efficient decision tree for it.
>> >> >>>>>>>>> >> >
>> >> >>>>>>>>> >> > log(x*y) -> log(x) + log(y);   x > 0, y > 0
>> >> >>>>>>>>> >> >
>> >> >>>>>>>>> >> >
>> >> >>>>>>>>> >> > In the above example how do we exactly move on with
>> >> >>>>>>>>> >> > domain
>> >> >>>>>>>>> >> > restrictions
>> >> >>>>>>>>> >> > (i.e. x, y).
>> >> >>>>>>>>> >> >
>> >> >>>>>>>>> >> > On Wednesday, March 1, 2017 at 8:39:41 PM UTC+5:30,
>> >> >>>>>>>>> >> > Ondřej
>> >> >>>>>>>>> >> > Čertík wrote:
>> >> >>>>>>>>> >> >>
>> >> >>>>>>>>> >> >> Hi,
>> >> >>>>>>>>> >> >>
>> >> >>>>>>>>> >> >> Here is a project that I would love to see happen:
>> >> >>>>>>>>> >> >>
>> >> >>>>>>>>> >> >> https://github.com/sympy/sympy/issues/12233
>> >> >>>>>>>>> >> >>
>> >> >>>>>>>>> >> >> I am available to mentor it, and I think quite a few
>> >> >>>>>>>>> >> >> people
>> >> >>>>>>>>> >> >> are
>> >> >>>>>>>>> >> >> excited about it and such a system/framework (i.e. set
>> >> >>>>>>>>> >> >> of
>> >> >>>>>>>>> >> >> rules for
>> >> >>>>>>>>> >> >> patter matching + compiler to generate a fast
>> >> >>>>>>>>> >> >> if/then/else
>> >> >>>>>>>>> >> >> decision
>> >> >>>>>>>>> >> >> tree) would have applications beyond just integration,
>> >> >>>>>>>>> >> >> but
>> >> >>>>>>>>> >> >> integration
>> >> >>>>>>>>> >> >> would already be super useful. As you can browse on
>> >> >>>>>>>>> >> >> Rubi
>> >> >>>>>>>>> >> >> web
>> >> >>>>>>>>> >> >> page, the
>> >> >>>>>>>>> >> >> integrator's capabilities are very impressive, i.e. the
>> >> >>>>>>>>> >> >> rule
>> >> >>>>>>>>> >> >> based
>> >> >>>>>>>>> >> >> system Rubi 4.9 can do more integrals than Mathematica,
>> >> >>>>>>>>> >> >> and
>> >> >>>>>>>>> >> >> is about
>> >> >>>>>>>>> >> >> as fast, due to the large number of rules, and the
>> >> >>>>>>>>> >> >> if/then/else
>> >> >>>>>>>>> >> >> decision tree Rubi 5 promises an order of magnitude (or
>> >> >>>>>>>>> >> >> more)
>> >> >>>>>>>>> >> >> speedup,
>> >> >>>>>>>>> >> >> but it's still in development.
>> >> >>>>>>>>> >> >>
>> >> >>>>>>>>> >> >> The project is big in scope, so there could even be
>> >> >>>>>>>>> >> >> multiple
>> >> >>>>>>>>> >> >> projects.
>> >> >>>>>>>>> >> >> If anybody is interested in this, please get in touch,
>> >> >>>>>>>>> >> >> and
>> >> >>>>>>>>> >> >> try to
>> >> >>>>>>>>> >> >> propose a good plan.
>> >> >>>>>>>>> >> >>
>> >> >>>>>>>>> >> >> 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
>> >> >>>>>>>>> >> > https://groups.google.com/group/sympy.
>> >> >>>>>>>>> >> > To view this discussion on the web visit
>> >> >>>>>>>>> >> >
>> >> >>>>>>>>> >> >
>> >> >>>>>>>>> >> >
>> >> >>>>>>>>> >> >
>> >> >>>>>>>>> >> > https://groups.google.com/d/msgid/sympy/05a4ee3e-7a0b-485b-9918-0a68bb4f3350%40googlegroups.com.
>> >> >>>>>>>>> >> >
>> >> >>>>>>>>> >> > 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 [email protected].
>> >> >>>>>>>>> > To post to this group, send email to
>> >> >>>>>>>>> > [email protected].
>> >> >>>>>>>>> > Visit this group at https://groups.google.com/group/sympy.
>> >> >>>>>>>>> > To view this discussion on the web visit
>> >> >>>>>>>>> >
>> >> >>>>>>>>> >
>> >> >>>>>>>>> >
>> >> >>>>>>>>> > https://groups.google.com/d/msgid/sympy/0cc84418-0eac-4ab2-b975-c74eeec47d64%40googlegroups.com.
>> >> >>>>>>>>> >
>> >> >>>>>>>>> > 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 [email protected].
>> >> >>>>>>> To post to this group, send email to [email protected].
>> >> >>>>>>> Visit this group at https://groups.google.com/group/sympy.
>> >> >>>>>>> To view this discussion on the web visit
>> >> >>>>>>>
>> >> >>>>>>>
>> >> >>>>>>> https://groups.google.com/d/msgid/sympy/8efee19b-fedd-4188-b00f-e68ecf288eb5%40googlegroups.com.
>> >> >>>>>>> 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 [email protected].
>> >> >>> To post to this group, send email to [email protected].
>> >> >>> Visit this group at https://groups.google.com/group/sympy.
>> >> >>> To view this discussion on the web visit
>> >> >>>
>> >> >>>
>> >> >>> https://groups.google.com/d/msgid/sympy/6e64ae8e-2c19-49ca-9d74-fb873ac77112%40googlegroups.com.
>> >> >>> 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 [email protected].
>> >> > To post to this group, send email to [email protected].
>> >> > Visit this group at https://groups.google.com/group/sympy.
>> >> > To view this discussion on the web visit
>> >> >
>> >> >
>> >> > https://groups.google.com/d/msgid/sympy/2d53f1c8-52b3-4a0a-89af-bf70d83d4df1%40googlegroups.com.
>> >> >
>> >> > 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 [email protected].
>> > To post to this group, send email to [email protected].
>> > Visit this group at https://groups.google.com/group/sympy.
>> > To view this discussion on the web visit
>> >
>> > https://groups.google.com/d/msgid/sympy/06665b8f-9e0e-4231-8032-1610a9c01072%40googlegroups.com.
>> >
>> > 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 [email protected].
> To post to this group, send email to [email protected].
> Visit this group at https://groups.google.com/group/sympy.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/sympy/a533e5e6-80f0-4f28-a75d-a328ea71b5a8%40googlegroups.com.
>
> 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 [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sympy.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sympy/CAKgW%3D6JzOwyCj%2BDqG9xiLWyA%2BN2zSU43CLqL1voYToW%2BcXXKkg%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to