From: Bart V. <bar...@cs...> - 2006-07-06 11:50:38
|
Tim Hochberg wrote: > Bart Vandereycken wrote: >> Hi all, >> >> reading the thread "Ransom proposals" I was wondering why there isn't a >> ndarray.dot() method? There is already a scipy.sparse.dot() so this >> would fit nicely in the whole idea of polymorphism. >> > Are you sure about that? > > The problem with a dot method (aside from a over proliferation of > methods in general) is that to be done correctly you want to choose a > particular implementation of dot based *both* of its arguments. A method > does a good job dispatching on a single argument, but falls down when > dispatching on two types. Let's look at this specific case. Imagine that > in addition ndarray.dot and sparse.dot, we also stick a dot method on > ma.masked, etc. Now in order to fully exploit polymorphism and get > maximum efficiency, we want asparsearray.dot(amaskedarray) to correctly > treat the masked values (ma.dot treats them as zeros) and to not > instantiate a dense version of the sparsearray. But in order to do that > all three classes need to know about the other two. That's possible, if > messy since all three of these are known in advance, but this approach > becomes untenable if you classes outside core numpy or scipy to > participate as full citizens. You're right that you need to put the class specific dot code somewhere. However, it would be better if this can be done in a clean way. By the way I don't fixate on methods or functions, I just want something useful ;-) Suppose I have written my own matrix class (custmatrix) with it's own fast matrix-vector product. How can I extend numpy code so that is uses this fast multiplication when I want a_custmatrix*a_ndarray or a_ndarray*a_custmatrix? > What does appear fit well here is generic functions / multimethods / > protocols as discussed in some detail on pydev-3000 a couple of months > ago. This would allow classes defined outside of core numpy and scipy to > work correctly and efficiently with dot as long as they register > appropriate versions of dot. If I wasn't swamped right at the moment I'd > prototype this up and see how it works in practice. Right, I was thinking about multimethods too after reading http://www.artima.com/weblogs/viewpost.jsp?thread=101605 The other solution that simulates double dispatching is the Visitor pattern, but it has a lot of disadvantages (difficult to add custom matrices, slow?, all the matrices have to be children of an abstract class). Bart |