Dear Jason, Thanks! I think, I got the idea.
Peter On Wed 29. Mar 2023 at 11:33 Jason Moore <moorepa...@gmail.com> wrote: > The old are what I just showed "positive=True" when defining variables. > > The new idea is to do something like: > > with assume(x > 0): > res = Abs(x) > > res will then be just x. > > That's not the syntax though, I don't know it off the top of my head. > > moorepants.info > +01 530-601-9791 > > > On Wed, Mar 29, 2023 at 11:10 AM Peter Stahlecker < > peter.stahlec...@gmail.com> wrote: > >> Dear Jason, >> >> YES, of course I remember. >> This means, assumptions have the literal English meaning, like 'I asssume >> x to be real and larger than 5'? >> If I understood correctly, then what are 'old' and 'new' assumptions? >> >> Thanks, Peter >> >> On Wed 29. Mar 2023 at 10:11 Jason Moore <moorepa...@gmail.com> wrote: >> >>> Hi Peter, >>> >>> You've probably seen this example: >>> https://moorepants.github.io/learn-multibody-dynamics/sympy.html#differentiating, >>> but in the "warning" box you can see how setting assumptions on the >>> variables changes the results (positive, real, etc). >>> >>> Jason >>> moorepants.info >>> +01 530-601-9791 >>> >>> >>> On Wed, Mar 29, 2023 at 10:03 AM Peter Stahlecker < >>> peter.stahlec...@gmail.com> wrote: >>> >>>> Dear Tilo, >>>> >>>> I am just a (semi retired) recreational user of sympy, mostly >>>> sympy.physics.mechanics. I have no ambition, and certainly no skills to do >>>> anything with the code itself. >>>> Still, I like to understand things as much as possible, therefore my >>>> question: >>>> >>>> what is meant by *assumptions*? >>>> >>>> Thanks a lot! >>>> >>>> Peter >>>> >>>> On Wed 29. Mar 2023 at 09:26 Aaron Meurer <asmeu...@gmail.com> wrote: >>>> >>>>> >>>>> >>>>> On Wed, Mar 29, 2023 at 12:21 AM Tilo RC <tiloren...@gmail.com> wrote: >>>>> >>>>>> Thank you for your response Oscar. I think I’m interested in taking >>>>>> a stab at improving the capabilities of the new assumption system to deal >>>>>> with inequalities (and perhaps relations between symbols in general?). >>>>>> I’ve >>>>>> spent a lot of time reading through the documentation, code, discussions, >>>>>> and previous proposals related to assumptions and come to some >>>>>> understanding. I’ve tried to explain what I understand so far below. >>>>>> Could >>>>>> you read through what I’ve written and correct any mistakes in my >>>>>> thinking? >>>>>> >>>>>> For around a decade the SymPy community has wanted to transition from >>>>>> the “old assumptions” to the “new assumptions.” The old assumptions are >>>>>> seen as fundamentally limited compared to the new assumptions for reasons >>>>>> I’m trying to figure out. This is my understanding: >>>>>> >>>>>> - >>>>>> >>>>>> The old assumption system is deeply connected to the core of >>>>>> sympy. I think this is bad because it’s responsible for some of the >>>>>> other >>>>>> problems with it and violates OOP principles. >>>>>> >>>>>> >>>>> It's not bad because of some abstract reasons. The issue is that the >>>>> old assumptions design limits what it is able to do. Assumptions can only >>>>> be made on symbols, deductions can only be done via direct chains of >>>>> inference from handlers, and it's impossible to add additional facts to >>>>> the >>>>> system except by adding handlers to the specific relevant classes. >>>>> >>>>> Just as an example, inequality assumptions like x > 1 are simply >>>>> impossible to even represent in the old assumptions. >>>>> >>>>> >>>>>> >>>>>> - >>>>>> >>>>>> One fundamental flaw of the old assumption system is that it’s >>>>>> not possible to make assumptions about relations between different >>>>>> variables. The new assumption system has this capability, and even >>>>>> though >>>>>> it is not very feature rich, it has a lot of potential. >>>>>> >>>>>> >>>>> This is correct. >>>>> >>>>> >>>>>> >>>>>> - >>>>>> >>>>>> The old assumption system slows down SymPy. I’m not sure how true >>>>>> this still is. It seems like the core and the old assumption system >>>>>> have >>>>>> gotten many improvements to make them faster. For example, because I >>>>>> accidentally read the SymPy 1.11 >>>>>> >>>>>> <https://docs.sympy.org/latest/guides/assumptions.html#mechanism-of-the-assumptions-system> >>>>>> instead of the SymPy 1.13 >>>>>> >>>>>> <https://docs.sympy.org/dev/guides/assumptions.html#mechanism-of-the-assumptions-system> >>>>>> documentation I learned about the ManagedProperties metaclass and >>>>>> then saw >>>>>> it was removed to improve efficiency. (By the way, both of these >>>>>> sections >>>>>> from the documentation say that “This explanation is written as of >>>>>> SymPy >>>>>> 1.7.” even though the writing clearly changed between 1.11 and 1.13). >>>>>> >>>>>> >>>>> This is still true. The issue isn't just the speed of the old >>>>> assumptions, but the fact that object constructors make heavy use of them. >>>>> Take the expression in https://github.com/sympy/sympy/issues/24565, >>>>> which takes 30 seconds just to construct. This time is all spent in >>>>> assumptions. Ideally, simply constructing an expression shouldn't call any >>>>> assumptions. One of the reasons the new assumptions are separate from the >>>>> core is that there was a hope that this would make it easier to remove >>>>> assumptions from core constructors (but really that isn't necessary; we >>>>> just need to be better about not using assumptions in constructors). >>>>> >>>>> >>>>>> >>>>>> As for improving how the new assumptions deal with inequalities, >>>>>> there are some very basic features they’re missing. For example, >>>>>> ask(Q.negative(x),Q.ge(x,1)) returns None under the current system even >>>>>> though it seems like it would be really simple to implement something >>>>>> where >>>>>> if x > 0 then x is not negative. Similarly, ask(Q.gt(x,0),Q.gt(x,1)) >>>>>> returns None. A more complicated query that returns None is >>>>>> ask(Q.eq(x,1), >>>>>> Q.integer(x) & Q.gt(x,0) & Q.lt(x,2)). >>>>>> >>>>>> I also notice that even equality is somewhat limited in the new >>>>>> assumption system. For example, ask(Q.positive(y), Q.eq(x,y) & >>>>>> Q.positive(x)) returns None. I’m a bit unsure why this hasn’t been >>>>>> implemented. One guess I have is that implementing this functionality >>>>>> would >>>>>> be too slow because maybe you would have to use the solver? >>>>>> >>>>> >>>>> No, it just hasn't been implemented. The idea here is that we need a >>>>> way to rewrite these predicates and/or generate new predicates that will >>>>> allow the assumptions system SAT solver to deduce things about the >>>>> symbols. >>>>> It needs to be done efficiently. There is likely literature on ways to do >>>>> this. For instance, if we have Eq(x, y) then we could add a predicate >>>>> Equivalent(p(x), p(y)) for every predicate p(x) and p(y), but there could >>>>> be a lot of such predicates. There's likely smarter ways to represent this >>>>> substitution system. I'm sure there's also good heuristics too (like just >>>>> substituting y for x everywhere). >>>>> >>>>> In general, we may need to move from a SAT solver to a SMT solver >>>>> approach to handle some of these things completely efficiently. >>>>> >>>>> >>>>>> Frankly, although I’ve spent a lot of time reading the files in the >>>>>> new assumption system, I only have a surface level understanding of them: >>>>>> >>>>>> >>>>>> - >>>>>> >>>>>> relation/equality.py >>>>>> - >>>>>> >>>>>> I probably understand this file the best out of all the files >>>>>> in the new assumptions. It contains implementations of binary >>>>>> relation for >>>>>> >, ≥, ≤, <, =, and ≠. >>>>>> - >>>>>> >>>>>> Ask.py >>>>>> - >>>>>> >>>>>> Heart of the new assumptions. Defines ask() and Q. In general, >>>>>> ask tries to find computationally cheap ways to evaluate >>>>>> propositions. If >>>>>> it can’t do it in a cheap way it calls the SAT solver. Also, all >>>>>> of the >>>>>> assumptions are converted into a normal form which I think is >>>>>> analogous to >>>>>> the role Chomsky normal form plays in allowing a parser to parse a >>>>>> grammar >>>>>> efficiently. >>>>>> >>>>>> >>>>>> How difficult would it be to implement something that deals with >>>>>> inequalities better? What about the specific cases I outline above? Would >>>>>> this be enough for a summer project? Do you think this task to advanced >>>>>> for >>>>>> someone of my background? >>>>>> >>>>> >>>>> You'll need to do more research, but if you are motivated it's not >>>>> impossible to do. You should first get a better understanding of the >>>>> basics >>>>> of SAT and concepts like CNF and satisfiability. Understanding the inner >>>>> workings of a SAT solver is also useful but not as important, at least for >>>>> a first pass. For the most part, you can treat a SAT solver as a black >>>>> box. >>>>> >>>>> It also would be a good idea to look at the literature to see if you >>>>> can find if anyone has written any papers on how to do this. This sort of >>>>> thing is already doable by SMT solvers so it's not completely novel, but >>>>> there may be simpler approaches when dealing with pure inequalities. >>>>> >>>>> The files you want to get an understanding of are satask and >>>>> sathandlers. In particular, if you can grok the basic way that satask >>>>> works >>>>> in how it gets answers from the SAT solver, that is a good first step. >>>>> >>>>> Aaron Meurer >>>>> >>>>> On Tuesday, March 21, 2023 at 1:23:12 PM UTC-7 Oscar wrote: >>>>>> >>>>>>> On Tue, 21 Mar 2023 at 09:02, Tilo RC <tilor...@gmail.com> wrote: >>>>>>> > >>>>>>> > Hello! My name is Tilo and I am a sophomore at Pomona College in >>>>>>> Claremont, California. Currently, I am double majoring in math and cs. >>>>>>> I am >>>>>>> highly interested in participating in GSoC with sympy because I believe >>>>>>> it >>>>>>> would be a great opportunity to enhance my programming skills and give >>>>>>> back >>>>>>> to the open-source community. >>>>>>> >>>>>>> Hi Tilo, >>>>>>> >>>>>>> > I am uncertain about which GSoC Ideas would suit me best, given my >>>>>>> background. However, I have some tentative ideas: >>>>>>> > >>>>>>> > Parsing >>>>>>> > >>>>>>> > Currently, I am enrolled in an introductory course on languages >>>>>>> and the theory of computation, where we have recently started exploring >>>>>>> parsers. Additionally, I am taking a natural language processing class >>>>>>> that >>>>>>> involves programming intensive assignments on probabilistic context-free >>>>>>> grammars and sentence parsing. However, I have limited experience in >>>>>>> some >>>>>>> of the potentially required languages such as Fortran, C, C++, Julia, >>>>>>> Rust, >>>>>>> LLVM, Octave, and Matlab. I think a project that focuses on existing >>>>>>> LaTeX >>>>>>> functionality would be a good fit. >>>>>>> >>>>>>> I think that what really needs to happen with parsing is to rewrite >>>>>>> the parsers based on something like lark. The current parsing code >>>>>>> either uses ad-hoc parsers or in the case of parse_expr uses eval. I >>>>>>> think that making it so that parse_expr does not use eval should be >>>>>>> a >>>>>>> top priority in parsing. >>>>>>> >>>>>>> > Assumptions >>>>>>> > >>>>>>> > This idea seems very challenging but it also interests me a lot. >>>>>>> However, a bug I found today made me want to learn more about how >>>>>>> sympy’s >>>>>>> assumption system works. It’s not exactly clear to me what the prereqs >>>>>>> for >>>>>>> working on this idea are. However, I have experience with number theory >>>>>>> which is listed as one of the prereqs for some reason. Also, I’ve taken >>>>>>> a >>>>>>> class on functional programing with coq which seems like it could >>>>>>> possibly >>>>>>> be relevant. >>>>>>> >>>>>>> Assumptions are a big topic. Making it so that the new assumptions >>>>>>> system can understand inequalities meaningfully would make a good >>>>>>> project. That is a very common feature request. I don't think number >>>>>>> theory is relevant. >>>>>>> >>>>>>> > Improve the plotting module >>>>>>> > >>>>>>> > If the other ideas seem unrealistic or impractical, this project >>>>>>> seems well-suited to my capabilities. I have experience with HTML, >>>>>>> Javascript, and CSS. (Actually, JavaScript was the first language I >>>>>>> learned. I even taught a lesson on using JS to approximate integrals in >>>>>>> my >>>>>>> high school calculus class. Hey! Python would’ve been better but >>>>>>> JavaScript >>>>>>> worked!). While working on an issue related to polygons I noticed that >>>>>>> there was no convenient way to plot polygons and other geometric >>>>>>> objects, >>>>>>> so maybe some of the work on this idea could add functionality related >>>>>>> to >>>>>>> that. >>>>>>> >>>>>>> Significant improvements have been made to the plotting module >>>>>>> through >>>>>>> sympy_plot_backends: >>>>>>> https://sympy-plot-backends.readthedocs.io/en/latest/ >>>>>>> >>>>>>> Integrating that improved plotting module back into SymPy would make >>>>>>> a >>>>>>> great project. There are some (I think small) difficulties in doing >>>>>>> this in a way that is backwards compatible so it needs a bit of >>>>>>> work: >>>>>>> https://github.com/sympy/sympy/issues/23036 >>>>>>> >>>>>>> -- >>>>>>> Oscar >>>>>>> >>>>>>> >>>>>>> > >>>>>>> > I would appreciate your opinion on which of these ideas to explore >>>>>>> further, and whether there are any better-suited to my background. >>>>>>> > >>>>>>> > -- >>>>>>> > 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+un...@googlegroups.com. >>>>>>> > To view this discussion on the web visit >>>>>>> https://groups.google.com/d/msgid/sympy/c4b9de3d-40e8-40e6-8546-c8fff11db9ban%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/96242267-2259-400e-a529-42c20994e2c9n%40googlegroups.com >>>>>> <https://groups.google.com/d/msgid/sympy/96242267-2259-400e-a529-42c20994e2c9n%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>>> . >>>>>> >>>>> -- >>>>> 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/CAKgW%3D6K12KOEF_%2BACjqrbkEJa0U3pWpGD8CcX2Ub-NjDbcWmeA%40mail.gmail.com >>>>> <https://groups.google.com/d/msgid/sympy/CAKgW%3D6K12KOEF_%2BACjqrbkEJa0U3pWpGD8CcX2Ub-NjDbcWmeA%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>>> . >>>>> >>>> -- >>>> Best regards, >>>> >>>> Peter Stahlecker >>>> >>>> -- >>>> 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/CABKqA0bCybNT9k_ntnn9fSu_CSk1Y8ODoESy%2B5iF1mqEDd%3D25Q%40mail.gmail.com >>>> <https://groups.google.com/d/msgid/sympy/CABKqA0bCybNT9k_ntnn9fSu_CSk1Y8ODoESy%2B5iF1mqEDd%3D25Q%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>> . >>>> >>> -- >>> 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/CAP7f1AiepG1f0AbGCbYDWpP%3DQ1ogk1o0Qkpjr2f_qL-fPr1rrw%40mail.gmail.com >>> <https://groups.google.com/d/msgid/sympy/CAP7f1AiepG1f0AbGCbYDWpP%3DQ1ogk1o0Qkpjr2f_qL-fPr1rrw%40mail.gmail.com?utm_medium=email&utm_source=footer> >>> . >>> >> -- >> Best regards, >> >> Peter Stahlecker >> >> -- >> 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/CABKqA0YM%3DOh1-fERXM5JZWbWHyL%2BcVUceFo1tDgsjVExi7OjiA%40mail.gmail.com >> <https://groups.google.com/d/msgid/sympy/CABKqA0YM%3DOh1-fERXM5JZWbWHyL%2BcVUceFo1tDgsjVExi7OjiA%40mail.gmail.com?utm_medium=email&utm_source=footer> >> . >> > -- > 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/CAP7f1AhxroLm7%3DQv1dHtm10k1MeT%2BNdgTLcONW%3DAfWU8Yk35Rw%40mail.gmail.com > <https://groups.google.com/d/msgid/sympy/CAP7f1AhxroLm7%3DQv1dHtm10k1MeT%2BNdgTLcONW%3DAfWU8Yk35Rw%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > -- Best regards, Peter Stahlecker -- 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/CABKqA0Z--bV250s2NcmRugKKpPaJKRPhTWioLL01mM9Lp2Wmcg%40mail.gmail.com.