использование скомпилированных функций f2py в numba в режиме «nopython»

#python #fortran #numba #f2py

Вопрос:

Я пытаюсь использовать скомпилированную функцию f2py в функцию python, украшенную декоратором @njit из numba. Сигнатура функции, завернутой в f2py, является:

 stp,f,g,task = xxx(stp,f,g,ftol,gtol,xtol,task,stpmin,stpmax,isave,dsave)

Wrapper for ``xxx``.

Parameters
----------
stp : input float
f : input float
g : input float
ftol : input float
gtol : input float
xtol : input float
task : input string(len=60)
stpmin : input float
stpmax : input float
isave : in/output rank-1 array('i') with bounds (2)
dsave : in/output rank-1 array('d') with bounds (13)

Returns
-------
stp : float
f : float
g : float
task : string(len=60)
 

и файл подписи включает в себя:

         subroutine xxx(stp,f,g,ftol,gtol,xtol,task,stpmin,stpmax,isave,dsave)
            double precision, intent(in,out) :: stp
            double precision, intent(in,out) :: f
            double precision, intent(in,out) :: g
            double precision, intent(in) :: ftol
            double precision, intent(in) :: gtol
            double precision, intent(in) :: xtol
            character*60, intent(in, out) :: task
            double precision, intent(in) :: stpmin
            double precision, intent(in) :: stpmax
            integer dimension(2), intent(inout) :: isave
            double precision dimension(13), intent(inout) :: dsave
        end subroutine xxx
 

Поскольку в режиме «nopython» numba должен знать сигнатуру внешней функции, мой текущий подход заключается в прямой загрузке xxx.so файл, созданный f2py с типами ctypes, вместо стандартного подхода «импорт». Затем я регистрирую входные и выходные аргументы функции с помощью типов ctypes следующим образом:

 lib = ctypes.cdll.LoadLibrary('xxx.so')
lib.dcsrch_.argtypes = [ctypes.c_double, ctypes.c_double, ctypes.c_double,
                        ctypes.c_double, ctypes.c_double, ctypes.c_double,
                        ctypes.c_char_p(???), ctypes.c_double, ctypes.c_double,
                        np.ctypeslib.ndpointer(dtype=np.intc, ndim=1, shape=2), 
                        np.ctypeslib.ndpointer(dtype=np.double, ndim=1, shape=13)]
lib.dcsrch_.restype = ctypes.py_object(???).
 

Здесь (???) указывает на то, что я особенно не уверен в подписи. Когда я пытаюсь использовать функцию, я всегда получаю seg. ошибки неисправностей. В то же время при импорте функции стандартным способом, т. е. из xxx import xxx, все проходит гладко.

Я был бы очень признателен за некоторую помощь здесь. Спасибо!

Ответ №1:

Я думаю, что вы могли бы найти ответы в спецификации аргументов __doc__ , сделав что-то вроде

 from xxx import xxx
print(xxx.__doc__)
# or
print(xxx.function_name.__doc__)