On Thu, Jul 18, 2013 at 12:23 AM, Dmitriy Lyubimov <[email protected]>wrote:
> You are at HEAD of the trunk? > > Ok i will tinker a little more. But i am pretty sure different results are > produced for the same input if i just flip pivoted flag. I can add a java > version of the failing test as well if it is easier. > I have a java version. Still walking through your steps to see what is happening. Having another java version is not a bad thing. > I also noticed that R version is more accurate in detecting non positive > definite situations while Mahout version sometimes would accept it and > produce what seems like a nonsense. > Hmm... were these marginal situations? Or is the test in Mahout's version just stupid? > oh well. it seems to be working for me in my Bagel-based ALS-WR stuff for > now if i accurately assert valid input and don't use pivoted=true in > constructor. > OK. > Also, there seems to be no benefit in building classic thin QR > implementation then? I suspect A'A step could make this route more > expensive than a dedicated QR method, but i am not sure. > Correct. But I am not entirely clear how good the numerical properties are. It would be good to have somebody at least measure this. Not constructing Q except on the fly as it is needed is very nice. > > > On Wed, Jul 17, 2013 at 3:59 PM, Ted Dunning <[email protected]> > wrote: > > > My time budget for this problem for today is now exhausted. > > > > What I have determined so far: > > > > 1) CholeskyDecomposition produces correctly triangular matrices in your > > example (with or without pivoting) > > > > 2) multiplication of these matrices reproduces the input as expected > (with > > or without pivoting) > > > > 3) I am not looking clearly enough at the test of your example to > > understand the correct behavior. > > > > My route from this point is to start with Cholesky as a shortcut for QR > > decomposition via the identity: > > > > A = QR > > (QR)' (QR) = A' A = R' (Q' Q) R = R' R = L L' > > > > Thus A (L')^-1 = Q > > > > I will be checking that Q is produced and is orthonormal as expected. > > > > I begin to think that the overall problem is a misunderstanding of the > API > > rather than a functional error. That should be cured with better > > documentation, but it isn't clear that this will be easier than a code > bug. > > > > > > > > > > On Wed, Jul 17, 2013 at 3:13 PM, Dmitriy Lyubimov <[email protected]> > > wrote: > > > > > sorry, i mean ch.solveRight(eye(4)) fails with AOOB > > > > > > > > > On Wed, Jul 17, 2013 at 3:11 PM, Dmitriy Lyubimov <[email protected]> > > > wrote: > > > > > > > if you have scala plugin installed in idea, i have this scala DSL > > module > > > > added to mahout on this branch > > > > https://github.com/dlyubimov/mahout-commits/tree/dev-0.9.x-scala > > > > > > > > > > > > file > > > > > > /home/dmitriy/projects/asf/mahout-commits/math-scala/src/test/scala/mahout/math/MatrixOpsTest.scala > > > > > > > > this test fails if used with chol(a, true) or if > rightMultiply(eye(4)): > > > > > > > > test("chol") { > > > > > > > > // try to solve Ax=b with cholesky: > > > > // this requires > > > > // (LL')x = B > > > > // L'x= (L^-1)B > > > > // x=(L'^-1)(L^-1)B > > > > > > > > val a = dense((1, 2, 3), (2, 3, 4), (3, 4, 5.5)) > > > > > > > > // make sure it is symmetric for a valid solution > > > > a := a.t %*% a > > > > > > > > printf("A= \n%s\n", a) > > > > > > > > val b = dense((9, 8, 7)).t > > > > > > > > printf("b = \n%s\n", b) > > > > > > > > // fails if chol(a,true) > > > > val ch = chol(a) > > > > > > > > printf("L = \n%s\n", ch.getL) > > > > > > > > printf("(L^-1)b =\n%s\n", ch.solveLeft(b)) > > > > > > > > val x = ch.solveRight(eye(3)) %*% ch.solveLeft(b) > > > > > > > > printf("x = \n%s\n", x.toString) > > > > > > > > val axmb = (a %*% x) - b > > > > > > > > printf("AX - B = \n%s\n", axmb.toString) > > > > > > > > assert(axmb.norm < 1e-10) > > > > > > > > } > > > > > > > > > > > > > > > > > > > > On Wed, Jul 17, 2013 at 2:28 PM, Ted Dunning <[email protected] > > > >wrote: > > > > > > > >> These problems are very strange. > > > >> > > > >> I am now looking at the tests for Cholesky and it seems that they > > cover > > > >> all > > > >> of the sorts of things that you are talking about. > > > >> > > > >> I can fix the size compatibility test and will add a test that > > > implements > > > >> your other issue to see if that helps me understand what is > happening. > > > >> > > > >> > > > >> On Wed, Jul 17, 2013 at 1:02 PM, Dmitriy Lyubimov < > [email protected]> > > > >> wrote: > > > >> > > > >> > btw, another nitpicking, solveRight(eye(n) ) and solveLeft() do > not > > > >> check > > > >> > for cardinality of argument, throwing ArrayOutOfBounds. yes the > > burden > > > >> of > > > >> > dumbness is on the user but the burden of explanation is on > > > >> implementation > > > >> > :) > > > >> > > > > >> > > > > > > > > > > > > > >
