Thank you Oscar for this really exhaustive answer! You clarified all my
doubts.

Davide.


Il giorno lun 8 giu 2020 alle ore 00:08 Oscar Benjamin <
oscar.j.benja...@gmail.com> ha scritto:

> Hi Davide,
>
> I'll answer your questions one by one and then summarise the situation
> below.
>
> 1. Are the two modules interacting together now?
>
> The old and new assumptions interact in one direction: the new
> assumptions will query the old assumptions if it helps but the old
> assumptions are ignorant of the new. The rest of sympy does not really
> use the new assumptions though so any assumptions stated using e.g.
> "assuming" will be ignored by almost all of the code in sympy (e.g.
> integrate, solve etc).
>
> 2. Is the new module able to do everything the old module does?
>
> Since the new assumptions query the old they can make use of any
> information that is available in the old assumptions. In that sense a
> query using "ask" from the new assumptions API can answer all the same
> questions that the old assumptions API can. The new assumptions can
> also be used for a wider range of queries for example queries about
> matrices. The old assumptions are really just about numbers and can
> only answer questions like "is this a positive number".
>
> 3. What are the limitation of the new module? Where is it not implemented?
>
> The new assumptions were made a lot faster last Summer. Their slowness
> was one major limitation before. They are still slow in comparison to
> the old assumptions. The real limitation is the fact that the old
> assumptions are used all across the codebase in both elementary
> evaluations and in more complex routines. A huge amount of code would
> need to be changed in order to make it so that general routines like
> "integrate" use the new assumptions.
>
> I guess that the original plan was for the new assumptions to replace
> the old so that they could be a dropin replacement and then the old
> assumptions API would still be there but it would call into the new
> assumptions in order to resolve its queries. That's not possible
> though because the new assumptions actually depend on the old and
> there is a huge amount of work invested in making the old assumptions
> work the way that they do so replicating that in the new assumptions
> so that they can stand on their own without the old is not a small
> task.
>
> My main problem with the idea that the new assumptions can replace the
> old is about the internal organisation of the code base itself. The
> old assumptions are used as part of the internals of evaluating an
> expression such as "cos(n*pi)". To me that makes sense because
> evaluation creates Basic instances and the old assumptions sit on a
> "level below" symbolic evaluation and (mostly) do not create any Basic
> instances. The new assumptions API uses Basic instances even in order
> to express a query. That means that using the new assumptions as part
> of evaluation creates an inherent circularity and it also explains why
> the new assumptions are so slow (or at least limits how much faster
> they can get).
>
> There are other problems with the new assumptions such as the idea
> that we can have a global flag as the "with assuming(...)" API
> implies. The "assuming" context manager seems like a fundamentally bad
> idea to me because the intention is that it will bring in a global
> flag that will alter the behavour of every other part of the codebase.
> That means that it breaks thread-safety, that the cache would need to
> be cleared every time anything is assumed, that code is unpredictable
> because its behaviour can be manipulated from outside and many more
> problems. Basically the assuming API implies a massive and very
> complicated global variable and those are not usually good.
>
> If we want to use the new assumptions properly as part of lots of
> different functions around the codebase then the clean way is for most
> APIs to grow an assumptions keyword e.g.:
>
>     sol = solve(a*x - b, x, assumptions=Q.nonzero(a))
>
> Adding the assumptions keyword across all APIs and making use of it in
> the relevant functions is a lot of work but nowhere near as much as
> rewriting the old assumptions as the new. Then the new assumptions can
> be used judiciously at key places in key APIs so they won't cause a
> slowdown like they would if they were used as part of every elementary
> evaluation.
>
> The future I see for the old and new assumptions is that they will
> coexist. The old assumptions will be there for simple cases and will
> be used internally as part of evaluation. The new assumptions will be
> able to express more complex queries but will not be used
> automatically although some higher level APIs like integrate/solve
> could use the new assumptions for simplification or refinement. That
> gives us a clear path forward that can be implemented incrementally
>
> So to summarise the situation:
>
> 1. The new assumptions are basically not used anywhere in sympy.
> 2. You should not expect them to alter the behaviour of evaluation or
> of higher-level APIs like integrate.
> 3. You can try to refine the results from integrate yourself using
> "refine" but the "assuming" context manager basically has no effect
> because none of the code inside integrate uses "ask".
>
> Oscar
>
> On Sat, 6 Jun 2020 at 15:18, Davide Sandona' <sandona.dav...@gmail.com>
> wrote:
> >
> > Until a couple of days ago, I always used the old assumption module
> defined in sympy.core.assumptions, where we create symbols with assumptions
> and then the expression infer the values for its assumptions. For example,
> I know that with this old module it's not possible to create a symbol x
> assuming x > y.
> >
> > Now I'm exploring the new assumption module, defined in
> sympy.assumptions. Looking at the documentation, at questions over
> StackOverflow and into this mailing list, I understand that this module
> should be more powerful. I also read this interesting thread [1] from 2016,
> to understand how these two modules interact with each other. Back then,
> the two modules were separate entities. Also, by looking at questions over
> StackOverflow, people say the new module is not integrated that much with
> the rest of Sympy.
> >
> > What I understood so far is that the new module is great to ask queries
> about expressions and their assumption, it is good to refine certain kind
> of expression, but it is not really good to perform computations with given
> assumptions... Let me explain with an example:
> >
> > x = symbols("x")
> > a = symbols("a")
> > exp(a * x).integrate(x)
> >
> > This is going to return a piecewise result, with the condition being a=0
> or different from 0. Suppose I use the old assumptions system:
> >
> > x = symbols("x")
> > a = symbols("a", nonzero=True)
> > exp(a * x).integrate(x)
> >
> > This is going to produce a single expression.
> >
> > Is there any way to produce the same single-expression result by using
> the new assumption module? I tried with this code:
> >
> > x = symbols("x")
> > a = symbols("a")
> > with assuming(Q.nonzero(a)):
> >     r = exp(a * x).integrate(x)
> > r
> >
> > However, it returns the piecewise result, so the assumption was not
> applied.
> >
> > In light of this, my questions are:
> >
> > Are the two modules interacting together now?
> > Is the new module able to do everything the old module does?
> > What are the limitation of the new module? Where is it not implemented?
> >
> > Thank you for your time,
> >
> > Davide.
> >
> > [1]
> https://groups.google.com/forum/#!searchin/sympy/assumptions|sort:date/sympy/AJVZdWnYQww/1VmnUmVEAAAJ
> >
> > --
> > 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 view this discussion on the web visit
> https://groups.google.com/d/msgid/sympy/d3ba620e-1a3b-4248-b30f-e62989370d8eo%40googlegroups.com
> .
>
> --
> 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 view this discussion on the web visit
> https://groups.google.com/d/msgid/sympy/CAHVvXxTsk9FJQ8okFuHHBeb_7tkMFzm-6kY7diff7QjnWLdakQ%40mail.gmail.com
> .
>

-- 
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/sympy/CAO%3D1Z08hqkYQF8d%3Dv-%3DDai6NXg6WzHArBpgB1NVXyrEhQy4H6g%40mail.gmail.com.

Reply via email to