I've recently come up with a need in my day-job for a SparseMatrix/SparseVector implementation, so would would like to offer to help on this project. I should still have karma for commons (my Apache id is [EMAIL PROTECTED] for those that haven't been around since my last commons commit. I'm primarily a Tomcat committer in Apache-land, but have worked on Modeler and Daemon as well). I have a degree in math, so I know my way around linear algebra. I've also been around in commons long enough to know that I should ask nicely first before starting to commit ;).
I'm still in the process of reviewing the patches, so don't have any specific recommendations yet. I'll re-post when I do. "Sujit Pal" <[EMAIL PROTECTED]> wrote in message news:[EMAIL PROTECTED] > I've updated MATH-230 with a fresh patch (this time against trunk, since > MATH_2_0 has been moved to trunk) putting back the fallback code Luc > pointed out was used for performance. > > Details are in the bug: > http://issues.apache.org/jira/browse/MATH-230 > > There are also some test times for running with the current version vs > the getEntry() stuff I put in, and for the current implementation. The > performance does degrade for large matrices with getEntry(), but not by > much for the sizes I was looking at, but since the complexity is > O(n**2), there is going to be more degradation at larger sizes. I wasn't > able to get the test to complete in either case in a reasonable length > of time (~10s). > > size data[][] getEntry() restored data[][] > [3x2]*[2x4] 0ms 0ms 0ms > [6x4]*[4x8]) 0ms 0ms 0ms > [12x8]*[8x16]) 1ms 0ms 0ms > [24x16]*[16x32] 2ms 2ms 2ms > [48x32]*[32x64]) 14ms 16ms 23ms > [96x64]*[64x128] 2ms 3ms 3ms > [192x128]*[128x256] 24ms 50ms 28ms > [384x256]*[256x512] 770ms 813ms 768ms > > One thing I would like to suggest. As a business programmer, I may have > to deal with matrices, but I would prefer not have to deal with > implementing individual matrix methods. Which is one reason someone like > me would want to use a library like commons-math in the first place. > However, as I found recently, I may have to make different > implementations of RealMatrix, which I would prefer to do by subclassing > and overriding the getEntry() and setEntry() methods. Many algorithms > are based on matrices (and they probably assume a JVM with a huge amount > of memory), so it makes the code cleaner to use matrices as an > abstraction, but I could use a Map, Lucene index, database table, etc as > storage for my data. Would it make sense to have a generic impl of > RealMatrix, perhaps called AbstractRealMatrixImpl where the getEntry and > setEntry are abstract, which is meant for this sort of application? > Obviously, this implies that there is a guarantee that getEntry and > setEntry are used uniformly throughout the code, except for special > cases such as RealMatrixImpl. > > -sujit > > On Tue, 2008-12-02 at 14:19 +0100, [EMAIL PROTECTED] wrote: >> ----- "Ted Dunning" <[EMAIL PROTECTED]> a écrit : >> >> > Is performance in LUD normally achieved by fast element access? Or is >> > it >> > done by using higher order operators on a view of a row (or column)? >> >> This is not used for LUD but only for simpler operations (multiplication, >> addition, subtraction). For these operations, the algorithm is almost >> reduced to one operation, so a single getEntry() instead of a direct >> access result is really a performance bottleneck. This does not mean it >> is the only point to improve, but it was the easiest one. >> >> The more I think about it, the more I feel your proposal to change the >> underlying layout is the way to go. I am ready to do it if you want once >> I have completed a first working implementation for SVD (even if this >> first implementation is not fast enough). I would however be interested >> if you could provide a few pointers to me, as you may have noticed, >> linear algebra is not my main field of activity. >> >> What would you suggest ? How is storage handled in colt ? >> >> Luc >> >> >> > >> > I know the the Colt package made the argument that the latter it far >> > preferable. I also know that Jama didn't do this, but was very hard >> > to >> > extend as a result. >> > >> > The colt approach was to require the matrices provide row, column and >> > submatrix view operations and that vectors and matrices support >> > functionally >> > oriented destructive updates. This can be hard for users to >> > understand so >> > you generally have to provide more algebraic interfaces as well, but >> > it can >> > work wonders for performance. >> > >> > On Mon, Dec 1, 2008 at 2:52 PM, Luc Maisonobe <[EMAIL PROTECTED]> >> > wrote: >> > >> > > For now, one thing that bother me is the removal of the dedicated >> > code >> > > that explicitely avoided getEntry(). This was added a few months ago >> > for >> > > performance reason, since the previous generic code was painfully >> > slow. >> > > The trick with the ClassCastException allows really fast check since >> > the >> > > virtual machine can completely optimize it out in some cases, it is >> > an >> > > enhancement of what was discussed here: >> > > http://markmail.org/message/36fgg7vx6gzd3ziu. Our discussion at >> > that >> > > time was that the more common case (RealMatrixImpl) should be as >> > > efficient as possible (and Ted wants now it to be even faster by >> > > changing the underlying storage which is a good thing). This trick >> > is >> > > not beautiful perfectly generic code, it is a pragmatic way to be >> > fast >> > > in a common case and removing it will most probably induce poorer >> > > performances. >> > > >> > >> > >> > >> > -- >> > Ted Dunning, CTO >> > DeepDyve >> > 4600 Bohannon Drive, Suite 220 >> > Menlo Park, CA 94025 >> > www.deepdyve.com >> > 650-324-0110, ext. 738 >> > 858-414-0013 (m) >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: [EMAIL PROTECTED] >> For additional commands, e-mail: [EMAIL PROTECTED] >> --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]