[SciPy-dev] help: wrapping generalized symmetric evp functions

Robert Cimrman cimrman3@ntc.zcu...
Tue Apr 8 08:14:09 CDT 2008

Pearu Peterson wrote:
> Robert Cimrman wrote:
>> I am now trying to add the following LAPACK functions into scipy:
>> ssygv, dsygv, chegv, zhegv, to be able to solve 'Ax = lambda Bx' with 
>> symmetric or Hermitian matrices efficiently (cf. 
>> http://www.netlib.org/lapack/lug/node34.html).
> New wrappers to lapack functions should be defined in scipy.lib.lapack.
> Eventually we should get rid of lapack wrappers in scipy.linalg.
> Grep for flapack_*.pyf.src files to see in which file the signature
> for a given lapack function should be inserted.
> Btw, scipy.lib.lapack already has wrappers for sygv and hegv functions.

*** to Pearu:
Great, thanks!

Does it mean that scipy.linalg should be updated to use the wrappers in 

*** to all:
IMHO scipy.linalg.decomp deserves a major refitting in the spirit of 
what is now going on with scipy.sparse - the arguments of the functions 
with same functionality have different names (both comparing to sparse 
equivalents and within decomp.py), there are too many eig* functions, etc.

There could be even proper solver classes (LinearSolver, 
EigenvalueSolver, etc.) with a common interface in each solver family. 
Below, as an example, is the code we use in sfepy. As you can see, the 
solver classes have only the __init__ method (can be used e.g. to 
pre-factorize a matrix in the case of a linear solver) and the __call__ 
method (application of the solver). Would it be interesting to have 
something in that spirit in scipy?

Then, in the meantime, in lobpcg, I will use directly something like:
import scipy.lib.lapack as ll
ll.get_lapack_funcs( ['hegv'] )

best regards,

class Solver( Struct ):
     def __init__( self, conf, **kwargs ):
         Struct.__init__( self, conf = conf, **kwargs )
     def __call__( self, **kwargs ):
         print 'called an abstract Solver instance!'
         raise ValueError

class LinearSolver( Solver ):
     def __init__( self, conf, mtx = None, status = None, **kwargs ):
         Solver.__init__( self, conf = conf, mtx = mtx, status = status,
                          **kwargs )
     def __call__( self, rhs, conf = None, mtx = None, status = None ):
         print 'called an abstract LinearSolver instance!'
         raise ValueError

class NonlinearSolver( Solver ):
     def __init__( self, conf, evaluator = None, linSolver = None,
                   status = None, **kwargs ):
         Solver.__init__( self, conf = conf, evaluator = evaluator,
                          linSolver = linSolver, status = status,
                          **kwargs )
     def __call__( self, state0, conf = None, evaluator = None,
                   linSolver = None, status = None ):
         print 'called an abstract NonlinearSolver instance!'
         raise ValueError

class EigenvalueSolver( Solver ):
     def __init__( self, conf, mtxA = None, mtxB = None, nEigs = None,
                   eigenvectors = None, status = None ):
         Solver.__init__( self, conf = conf, mtxA = mtxA, mtxB = mtxB,
                          nEigs = nEigs, eigenvectors = eigenvectors,
                          status = status )
     def __call__( self, mtxA, mtxB = None, nEigs = None,
                   eigenvectors = None, status = None, conf = None ):
         print 'called an abstract EigenvalueSolver instance!'
         raise ValueError

More information about the Scipy-dev mailing list