[SciPy-user] eigenvalues of sparse matrix
Travis Oliphant
oliphant at ee.byu.edu
Thu Oct 28 19:09:26 EDT 2004
Pearu Peterson wrote:
>
>
> On Thu, 28 Oct 2004, David Grant wrote:
>
>> Travis Oliphant wrote:
>>
>>>
>>>>
>>>> Does anyone know how much work it would be to get ARPACK support in
>>>> scipy? Even just minimal support. This is totally new ground for
>>>> me, so I'd like to know if I'm biting off more than I can chew.
>>>
>>>
>>>
>>>
>>> Not a lot for simple support if you use f2py.
>>>
>>> My suggestion would be to write an f2py interface for the desired
>>> routines and we can build up from there.
>>>
>>>
>> I assume your suggestion does not involve using this at all:
>> http://jrfonseca.dyndns.org/work/phd/ ?
>> I believe Josa Fonseca was going to use f2py, but he didn't.
>>
>> Here is from his web page:
>>
>> "These bindings weren't generated with any automatic binding
>> generation tool. Even though I initially tried both PyFortran and
>> f2py, both showed to be inappropriate to handle the specificity of
>> the ARPACK API. ARPACK uses a /reverse communication interface/ where
>> basically the API sucessively returns to caller which must take some
>> update steps, and re-call the API with most arguments untouched. The
>> intelligent (and silent) argument conversions made by the above tools
>> made very difficult to implement and debug the most simple example.
>> Also, for large-scale problems we wouldn't want any kind of array
>> conversion/transposing happening behind the scenes as that would
>> completely kill performance."
>
>
> I cannot agree with these conclusions, at least when using f2py. The
> array conversion can be easily avoided behind the scenes (because the
> main loop is in Fortran) and transposing is not even an issue as
> user-specific parts of ARPACK API contains only 1-dimensional arrays.
>
I am in agreement with Pearu. Look at the iterative package in
scipy.linalg. The underlying Fortran code uses reverse communication
and this was managed with f2py-generated wrappers.
>> "Therefore the bindings are faithfull to the original FORTRAN API and
>> are not very friendly as is. Nevertheless a Python wrapper to these
>> calls can easily be made, where all kind of type conversions and
>> dummy-safe actions can be made."
>
>
>> So who is right?
>
>
> I looked into ARPACK API and I think f2py could be effectively used to
> wrap
> ARPACK. For example, when considering SIMPLE/dssimp.f case then
> I would write a Fortran subroutine that contains dsaupd main-loop and
> call to dseupd (the subroutine av would be provided as a callback
> argument) and then wrap this subroutine with f2py.
My suggestion is to do something very similar as is done in
scipy/linalg/iterative.py wherein the object passed to the
Python-level code simply requires a matvec method (like all sparse
arrays have), or is a normal 2-d array. Then, call python-wrapped
dsaupd in a while loop which does the required thing after returning
from every dsaupd call.
This is the most flexible interface and deserves a place in scipy.
Pearu's suggestion is also useful and may be a bit faster (though I'm
not sure it would be noticeably faster).
-Travis
More information about the SciPy-User
mailing list