[Scipy-svn] r4114 - trunk/scipy/sparse/linalg/eigen/lobpcg

scipy-svn at scipy.org scipy-svn at scipy.org
Tue Apr 8 09:55:41 EDT 2008


Author: rc
Date: 2008-04-08 08:55:37 -0500 (Tue, 08 Apr 2008)
New Revision: 4114

Modified:
   trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py
Log:
removed symeig dependence, added symeig() function, some fixes


Modified: trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py
===================================================================
--- trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py	2008-04-08 04:31:24 UTC (rev 4113)
+++ trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py	2008-04-08 13:55:37 UTC (rev 4114)
@@ -5,9 +5,6 @@
 
 License: BSD
 
-Depends upon symeig (http://mdp-toolkit.sourceforge.net/symeig.html) for the
-moment, as the symmetric eigenvalue solvers were not available in scipy.
-
 (c) Robert Cimrman, Andrew Knyazev
 
 Examples in tests directory contributed by Nils Wagner.
@@ -21,12 +18,48 @@
 import scipy.sparse as sp
 import scipy.io as io
 from scipy.sparse.linalg import aslinearoperator, LinearOperator
+import scipy.linalg as sla
 
-try:
-    from symeig import symeig
-except:
-    raise ImportError('lobpcg requires symeig')
+## try:
+##     from symeig import symeig
+## except:
+##     raise ImportError('lobpcg requires symeig')
 
+def symeig( mtxA, mtxB = None, eigenvectors = True, select = None ):
+    import scipy.lib.lapack as ll
+    if select is None:
+        if nm.iscomplexobj( mtxA ):
+            if mtxB is None:
+                fun = ll.get_lapack_funcs( ['heev'], arrays = (mtxA,) )[0]
+            else:
+                fun = ll.get_lapack_funcs( ['hegv'], arrays = (mtxA,) )[0]
+        else:
+            if mtxB is None:
+                fun = ll.get_lapack_funcs( ['syev'], arrays = (mtxA,) )[0]
+            else:
+                fun = ll.get_lapack_funcs( ['sygv'], arrays = (mtxA,) )[0]
+##         print fun
+        w, v, info = fun( mtxA, mtxB )
+##         print w
+##         print v
+##         print info
+##         from symeig import symeig
+##         print symeig( mtxA, mtxB )
+    else:
+        out = sla.eig( mtxA, mtxB, right = eigenvectors )
+        w = out[0]
+        ii = nm.argsort( w )
+        w = w[slice( *select )]
+        if eigenvectors:
+                v = out[1][:,ii]
+                v = v[:,slice( *select )]
+
+    if eigenvectors:
+        out = w, v
+    else:
+        out = w
+    return out
+
 def pause():
     raw_input()
 
@@ -77,7 +110,7 @@
 def applyConstraints( blockVectorV, factYBY, blockVectorBY, blockVectorY ):
     """Internal. Changes blockVectorV in place."""
     gramYBV = sc.dot( blockVectorBY.T, blockVectorV )
-    tmp = sc.linalg.cho_solve( factYBY, gramYBV )
+    tmp = sla.cho_solve( factYBY, gramYBV )
     blockVectorV -= sc.dot( blockVectorY, tmp )
 
 
@@ -90,8 +123,8 @@
         else:
             blockVectorBV = blockVectorV # Shared data!!!
     gramVBV = sc.dot( blockVectorV.T, blockVectorBV )
-    gramVBV = sc.linalg.cholesky( gramVBV )
-    sc.linalg.inv( gramVBV, overwrite_a = True )
+    gramVBV = sla.cholesky( gramVBV )
+    sla.inv( gramVBV, overwrite_a = True )
     # gramVBV is now R^{-1}.
     blockVectorV = sc.dot( blockVectorV, gramVBV )
     if B is not None:
@@ -202,9 +235,9 @@
 
         if B is not None:
             B_dense = B(nm.eye(n))
-            _lambda, eigBlockVector = symeig(A_dense, B_dense, range=lohi )
+            _lambda, eigBlockVector = symeig(A_dense, B_dense, select=lohi )
         else:
-            _lambda, eigBlockVector = symeig(A_dense, range=lohi )
+            _lambda, eigBlockVector = symeig(A_dense, select=lohi )
 
         return _lambda, eigBlockVector
 
@@ -248,7 +281,7 @@
         gramYBY = sc.dot( blockVectorY.T, blockVectorBY )
         try:
             # gramYBY is a Cholesky factor from now on...
-            gramYBY = sc.linalg.cho_factor( gramYBY )
+            gramYBY = sla.cho_factor( gramYBY )
         except:
             raise ValueError('cannot handle linearly dependent constraints')
 
@@ -513,14 +546,14 @@
 
         return as2d( y )
 
-#    precond = spdiags( ivals, 0, n, n )
-
+    precond = spdiags( ivals, 0, n, n )
+#    precond = None
     tt = time.clock()
     eigs, vecs = lobpcg( X, A, B, blockVectorY = Y,
                          M = precond,
                          residualTolerance = 1e-4, maxIterations = 40,
                          largest = False, verbosityLevel = 1 )
     print 'solution time:', time.clock() - tt
-    print eigs
 
     print vecs
+    print eigs




More information about the Scipy-svn mailing list