[Numpy-discussion] SVD error in Numpy. Bug?

Nils Wagner nwagner@iam.uni-stuttgart...
Tue Mar 18 14:54:45 CDT 2008


On Tue, 18 Mar 2008 12:48:31 -0700 (PDT)
  Lou Pecora <lou_boog2000@yahoo.com> wrote:
> I have run into a failure of complex SVD in numpy
> (version='1.0.3.1').  The error is:
> 
>  File
> "/Library/Frameworks/Python.framework/Versions/2.4/lib/python2.4/site-packages/numpy/linalg/linalg.py",
> line 767, in svd
>    raise LinAlgError, 'SVD did not converge'
> numpy.linalg.linalg.LinAlgError: SVD did not converge
> 
> The matrix is complex 36 x 36. Very slight changes in
> the matrix components (~ one part in 10^4) are enough
> to make the error go away.  I have never seen this
> before and it goes against the fact (I think it's a
> mathematical fact) that SVD always exists.  A
> hard-coded upper limit on the iteration number allowed
> somewhere in the SVD C code seems to be the problem.
> Read on.
> 
> A google search turned up a few messages, included
> this one from 2002 where the same error occurred
> infrequently, but randomly (it seemed):
> 
> ----------------------------------------------
> One online message in August 2002:
> 
> Ok, so after several hours of trying to read that
> code, I found
> the parameter that needs to be tuned.  In case anyone
> has this
> problem and finds this thread a year from now, here's
> your hint:
> 
>File: Src/dlapack_lite.c
> Subroutine: dlasd4_
> Line: 22562
> 
> There's a for loop there that limits the number of
> iterations to
> 20.  Increasing this value to 50 allows my matrix to
> converge.
> I have not bothered to test what the "best" value for
> this number
> is, though.  In any case, it appears the number just
> exists to
> prevent infinite loops, and 50 isn't really that much
> closer to
> infinity than 20....  (Actually, I'm just going to set
> it to 100
> so I don't have to think about it ever again.)
> 
> Damian Menscher
> -- 
> -=#| Physics Grad Student & SysAdmin @ U Illinois
> Urbana-Champaign |#=-
> -=#| 488 LLP, 1110 W. Green St, Urbana, IL 61801
> Ofc:(217)333-0038 |#=-
> -=#| 1412 DCL, Workstation Services Group, CITES
> Ofc:(217)244-3862 |#=-
> -=#| <menscher at uiuc.edu> www.uiuc.edu/~menscher/
>Fax:(217)333-9819 |#=-
> --------------------------------------------------
> 
> I have looked in Src/dlapack_lite.c and line 22562 is
> no longer a line that sets a max. iterations
> parameter.  There are several set in the file, but
> that code is hard to figure (sort of a Fortran-in-C
> hybrid).  
> 
> Here's one, for example:
> 
>    maxit = *n * 6 * *n;   // Line 887
> 
> I have no idea which parameter to tweak.  Apparently
> this error is still in numpy (at least to my version).
> Does anyone have a fix?  Should I start a ticket (I
> think this is what people do)?  Any help appreciated.
> 

Please can you post your matrix (in MatrixMarket format
io.mmwrite) to the list.

Cheers,

          Nils


More information about the Numpy-discussion mailing list