On Thu, Apr 20, 2017 at 4:44 PM, Francesco Bonazzi <[email protected]> wrote:
> > > On Thursday, 20 April 2017 21:23:54 UTC+2, Aaron Meurer wrote: >> >> >> >> On Thu, Apr 20, 2017 at 6:12 AM, Francesco Bonazzi <[email protected]> >> wrote: >> > >> > >> > On Wednesday, 19 April 2017 21:51:08 UTC+2, Aaron Meurer wrote: >> >> >> >> Performance is a valid concern. We should definitely check that. >> >> >> >> The __slots__ part I don't know. That could probably be done >> differently. >> >> >> > >> > I didn't like that part too. Has anyone a better idea? >> > >> >> Regarding the implementation itself, how would you do it? The ability >> >> to make Mul or Add do custom stuff for custom objects is a very >> >> commonly requested feature. Would you keep it unimplemented, or do it >> >> some other way? >> > >> > >> > Yes, we really need this feature. >> > >> > Ideally we want to extend such mechanism to functions as well. >> >> For functions, dispatch works nicely. In fact, most functions are >> single-argument, so you only need single dispatch, which is basically >> SymPy's _eval_*thing* mechanism. We could extend Function so that it >> dispatches before eval() is called on the subclass (say, sin(x) could call >> x._eval_function(sin)). At least, that should work when nargs = 1. For >> nargs > 1, you need something more complicated. >> >> > Suppose we have the exponential of a MatrixSymbol, how do we transmit the > information that the result of the exponential function is a matrix? > > Suppose you have the expression: > > exp(MatrixSymbol("M", 3, 3)) + MatrixSymbol("A", 2, 2) > > It would be desirable to raise a *ShapeError*. > exponential is a bad example because ideally exp(x) would be equivalent to Pow(E, x). But for other functions, like sin(MatrixSymbol("M", 3, 3)), I would make it in the Function super class so that this calls MatrixSymbol("M", 3, 3)._eval_function(sin), which could return a result (and if not, calls sin.eval(MatrixSymbol("M", 3, 3)) as usual). > Francesco's solution maybe isn't the most general, but it seems simple, >> and capable of handling the use-cases I know of. >> > > I had a thought about using the arguments instead of a new __slots__. That > is, add an extra argument to the *args* that is hidden when printing, but > if *Mul* or* Add* meet it, they should post-process the other *args *and > pass it further. But this could also have its cons. > That would break a lot of things that do manual processing of Add or Mul args. Aaron Meurer > > >> Aaron Meurer >> >> > >> > >> >> >> >> Aaron Meurer >> >> >> >> On Wed, Apr 19, 2017 at 3:46 PM, Ronan Lamy <[email protected]> >> wrote: >> >> > Le 19/04/17 à 19:00, Francesco Bonazzi a écrit : >> >> >> >> >> >> >> >> >> >> >> >> On Wednesday, 19 April 2017 17:05:08 UTC+2, Ronan Lamy wrote: >> >> >> >> >> >> Le 18/04/17 à 21:28, Francesco Bonazzi a écrit : >> >> >> > I'm gonna merge this PR soon: >> >> >> > >> >> >> > https://github.com/sympy/sympy/pull/12508 >> >> >> <https://github.com/sympy/sympy/pull/12508> >> >> >> >> >> >> Wow, that's horrifying! Good luck maintaining it! >> >> >> >> >> >> >> >> >> Why is it horrifying? >> >> > >> >> > >> >> > Well, using __new__ in the first place is a big WTF (and yes, I know >> >> > that >> >> > sympy is pretty much stuck with it forever), but layering a hook to a >> >> > whole >> >> > new programming paradigm inside it is evil genius. Bonus horror >> points >> >> > for >> >> > introspecting __slots__ and doing such fundamental changes to solve a >> >> > minor >> >> > issue. >> >> > >> >> > And BTW, has anybody checked the impact on performance? IIUC, that >> adds >> >> > a >> >> > non-trivial amount of work to every Add or Mul instantiation. >> >> > >> >> > That being said, don't mind me. As long as I don't have to debug it, >> >> > that >> >> > code won't bother me. >> >> > >> >> > -- >> >> > 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/086034c8-3ad1-4059- >> 7424-d358f3de9b92%40gmail.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/03cf6d1f-83f6-4844- >> 9b5c-753e947f90ce%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/c4dbda7f-1798-4f2e-9103-b9a6f310f52d%40googlegroups.com > <https://groups.google.com/d/msgid/sympy/c4dbda7f-1798-4f2e-9103-b9a6f310f52d%40googlegroups.com?utm_medium=email&utm_source=footer> > . > > 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%3D6J-hJrU45e2m8SOTYrUwiOZnv5-ZKxNDifk9Aq8dRiGbQ%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
