I'm not sure if you have heard about, or familiar with term graph <https://en.wikipedia.org/wiki/Term_graph>, but I think that this can have the potential to generalize Basic object and make it to be a more efficient form, without 'mutability' trick to reduce the time and space complexity.
On Sunday, March 25, 2018 at 1:54:27 AM UTC+9 [email protected] wrote: > On Sat, Mar 24, 2018 at 11:16 AM, Aaron Meurer <[email protected]> wrote: > >> Assumedly the point of this is for performance, so that something like >> (x + y + z) + w doesn't require rebuilding x + y + z. >> >> I've thought for some time that Add should save its coeff: term >> dictionary, to make further additions faster. I'm not sure if this >> requires mutability. >> > > That's exactly what symengine does. It keeps the internal dictionary > structure and uses the dictionary. This makes .args a bit slower in > symengine, but with caching that should go away. Note that you'd need a > dictionary and a vector to keep the non-commutative and unevalauted objects. > > Isuru > > >> I believe mutability can work for builder classes, but it requires >> very careful bookkeeping, to invalidate anything pointing to it once >> it mutates. And as you noted, it can't be included in the hash of any >> mutable object. So in general, the mutable builder should be >> considered a cached preprocessing step. If it exists, and hasn't been >> invalidated, it can be used. Otherwise, it should be rebuilt from >> scratch. >> >> Aaron Meurer >> >> On Sat, Mar 24, 2018 at 11:28 AM, Francesco Bonazzi >> <[email protected]> wrote: >> > I was considering the possibility of mutable expressions in SymPy. >> > >> > Currently expressions such as Add and Mul are immutable once the class >> > constructor has been called and modifying their content requires the >> object >> > to be re-built. >> > >> > I have tried to write a draft to implement the builder pattern, for >> example >> > with an AddBuilder object: >> > >> https://github.com/Upabjojr/sympy/blob/f4e26d9a7314ad5093b97c7e84a581f523d38efb/sympy/core/dispatchers_add.py#L8 >> > >> > The builder class is mutable and would be added elements until it is >> passed >> > to some method that builds the underlying class, Add in this case. >> > >> > At this point construction of objects could be done through multiple >> > dispatching an append method to the builder class. Unfortunately this >> makes >> > everything much more complicated, as every object that potentially >> needs to >> > subclass __add__ could potentially need its own builder object. >> > >> > There have been other attempts at creating mutable corresponding >> objects, >> > e.g.: >> > https://github.com/sympy/sympy/blob/master/sympy/unify/core.py#L24 >> > >> > Unfortunately once the SymPy expression is deconstructed, it remains >> > unusable. >> > >> > Proposal:what about allowing SymPy objects to exist in a mutable state? >> For >> > example, introduce a mutable=False option to Basic, so that if mutable >> is >> > set to True, there could be a way to edit the args. >> > >> > There could be potential problems with the hashing. One possible >> solution >> > could be not to allow immutable objects to contain mutable ones. >> > > >> > -- >> > 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/ecc4eaa9-28dc-44a4-9ed0-402adea432e5%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%3D6JiU_Qixnk3Eon8P_rBwxUNf5gs%2BiFEcWmM3%3DYC_eTYxg%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 [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/e2e48770-7822-439c-b9cb-7ca8322e7c4dn%40googlegroups.com.
