I think it looks good so far. I like how you cleanly organized your pull requests. That helps a lot.
My comments: - I'm putting this up front because I think it's the most important point. I feel that you are only addressing half of the issue at https://github.com/sympy/sympy/issues/6659, namely the output format of solve. What about the input API? Here is the parameter list for solve() (I had to construct this manually from the docstring since the code uses **kwargs): solve(f, *symbols, dict=False, set=False, exclude=(), check=True, numerical=True, minimal=False, warning=False, simplify=True, force=False, rational=True, manual=False, implicit=False, minimal=False, quick=False) That's assuming there aren't any undocumented parameters. And don't get me started on the mess of linear equation solving functions. We probably have a dozen functions that solve linear equations or systems of linear equations (see some of the discussion at https://github.com/sympy/sympy/pull/2580). I like that you're adding new stuff and cleaning up the output API, but you should think about how to clean up the input API as well. - Your example In[]: soln = solve(sin(x)*sin(y), (x, y), input_set = Interval(0, 4)*Interval(0, 4)) is a bit confusing to me. The input_set argument gives a 2-dimensional set, but how are you to know which axis is x and which is y? - You talk a lot about using sets, which I think is a good idea. But you should think about how you can also use the assumptions. Maybe there is a clean way that we can go back and forth between assumptions and sets that requires minimal code duplication, and also allows each to take advantage of the algorithms implemented in the other (by the way, when I say assumptions, you should probably only worry about the new assumptions, i.e., the stuff in the Q object). - Your section on singularities doesn't really make it clear why we need the solvers to be improved to do this, namely, that we need to know exactly when we have all the solutions to not get wrong results. - How will we handle that situation (finding all solutions)? What if we can't say anything? Can we still represent objects in such a way that it is not wrong (basically by somehow saying, "here are 'some' of the solutions, but maybe not all of them", and ditto for anything that uses solve, like singularities)? Maybe Piecewise is sufficient somehow? - I'm glad to see you are working on improving the simplicity of the results of solve, such as radical denesting. A potential simplification routine uses minpoly() on an algebraic expression and then uses solve to find a simpler solution, but this relies on the results of solve being simple. Do the radical denesting algorithms work with symbolic entries as well? - Did you plan to add any new solvers? I think there are still quite a few cases that we can't solve. Some higher degree irreducible polynomials for instance (not all higher degree polynomials are solvable by radicals but some are). There will also be a lot to implement once we are able to even represent the solutions to sin(x)=0. Aaron Meurer On Tue, Mar 11, 2014 at 8:40 AM, Harsh Gupta <gupta.hars...@gmail.com> wrote: > Hi, I have put my the first draft of the proposal on the sympy wiki. > > https://github.com/sympy/sympy/wiki/GSoC-2014-Application-Harsh-Gupta:-Solvers > > Please have a look, your suggestions will be valuable. > > On 22 February 2014 01:27, Harsh Gupta <gupta.hars...@gmail.com> wrote: >> I realize that there is less than a month left for the application >> deadline and it has already been a month since I posted this thread. >> So, I need to come up with design details fast. I have written some >> details about using sets as output for solvers in this PR >> https://github.com/sympy/sympy/pull/2948/files. PR because I feel it >> is better platform to facilitate this discussion than the mailing >> list. Please have a look. >> >> On 16 February 2014 07:15, Jigar Mistry <jigarmistr...@gmail.com> wrote: >>> i am also interested in solvers module. how can i contribute to simpy using >>> this solvers module.Plz help me.... >>> >>> >>> On Tuesday, 21 January 2014 16:25:13 UTC+5:30, Harsh Gupta wrote: >>>> >>>> Hi, I'm Harsh Gupta I will be GSOC applicant this year. I want to discuss >>>> the solvers idea given on the Idea's >>>> page.https://github.com/sympy/sympy/wiki/GSoC-2014-Ideas#solvers >>>> >>>> Some of the aspect of the idea are discussed at >>>> https://groups.google.com/forum/?fromgroups=#!starred/sympy/8TM8cnuzkG8. >>>> >>>> >>>> Aaron Meurer said: >>>> >>>>> I think with TransformationSet we can do quite a bit. That handles >>>>> sets like {f(x) | x in A}. I think what is missing is the basic set >>>>> builder {x | P(x)}, where P(x) is a boolean predicate. >>>> >>>> >>>> >>>> Matthew Rocklin said: >>>> >>>>>> > Real issue here - how to represent some solutions (e.g. sin(x)==0). >>>>> >>>>> In sets we would represent this with >>>>> In [1]: imageset(k, pi*k, S.Integers) >>>>> Out[1]: {π⋅k | k ∊ ℤ} >>>> >>>> >>>> Implementing a general set builder will be very useful, we will need to >>>> define basic set operations like union >>>> and intersection on them. We might use a syntax like `BuildSet(expr, >>>> sym_in_inputset, cond)` >>>> >>>> In [1]: BuildSet(pi*k, (k, S.Integers), True).intersect(0, 10) >>>> Out[1]: {pi, 2*pi, 3*pi} >>>> >>>> >>>> Matthew Rocklin said: >>>> >>>>> It sounds like maybe solve should return a Set. >>>> >>>> >>>> I think it will be necessary to return set if we want to represent the >>>> solution of expressions like `floor(x) - 5`. >>>> See https://code.google.com/p/sympy/issues/detail?id=3975. >>>> One problem I see with returning sets is that it can break a lot of >>>> existing code. >>>> >>>> >>>> As mentioned in the idea page we need to have a method to check if solve >>>> returns all the solutions. For polynomials or expressions which are >>>> solved by converting to polynomials we can compare the degree of the >>>> polynomial to the number of solutions returned. >>>> >>>> Other method can be verifying the number of the solutions by using the >>>> derivative of the function. Say we are given a *continuous* and >>>> *differentiable* function f(x) and it's derivative w.r.t x is g(x), >>>> then if g(x) has n solutions then f(x) cannot have more than n + 1 >>>> solutions. So, if the solve returns n + 1 solutions for f(x) then we are >>>> guaranteed that we have found all the solutions. >>>> For this we will need a discontinuity finder and we will also have to make >>>> sure that we have found all the solutions for g(x), i.e., the derivative of >>>> f(x), which can be done recursively or by using other methods. >>>> >>>> A third way can be using numerical solver. Say we use solve to find the >>>> solution of f(x) for some interval [a, b] then we can also run the >>>> numerical >>>> solver for f(x) on [a, b] >>>> if the number of solutions by numerical solver and symbolic solve matches >>>> then we can be pretty sure that we have found out all the solutions of f(x) >>>> in [a, b]. >>>> >>>> -- >>>> Harsh >>> >>> -- >>> 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+unsubscr...@googlegroups.com. >>> To post to this group, send email to sympy@googlegroups.com. >>> Visit this group at http://groups.google.com/group/sympy. >>> For more options, visit https://groups.google.com/groups/opt_out. >> >> >> >> -- >> Harsh > > > > -- > Harsh > > -- > 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+unsubscr...@googlegroups.com. > To post to this group, send email to sympy@googlegroups.com. > Visit this group at http://groups.google.com/group/sympy. > To view this discussion on the web visit > https://groups.google.com/d/msgid/sympy/CADN8iuohUoie3-eQHG5C_%2BEtKsfs%2BJ%2Bk2P-_DdLMPSBbLtXXDA%40mail.gmail.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 sympy+unsubscr...@googlegroups.com. To post to this group, send email to sympy@googlegroups.com. Visit this group at http://groups.google.com/group/sympy. To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/CAKgW%3D6KJVcvAhtX0iXPN%3DRy9DVrt642KmXLkAxLSxMDpNy5jiA%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.