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] <javascript:>> 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] <javascript:>. > > To post to this group, send email to [email protected] > <javascript:>. > > 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.
