У Numpy есть базовый pxd, который объявляет свой интерфейс c к cython.Существует ли такой pxd для компонентов scipy (особенно scipy.integrate.quadpack)?
В качестве альтернативы, может ли кто-нибудь привести пример прямой связи с функциями c / fortran, включенными в scipy из cython?До сих пор я всегда использовал pyximport ... будет ли это работать здесь, или мне придется связывать, используя distutils (или make ..)?
Спасибо!
---- ОБНОВЛЕНИЕ ----
Приведенный ниже код Cython компилируется;тем не менее, я получаю
ImportError: Building module failed: ['ImportError: dlopen(/Users/shauncutts/.pyxbld/lib.macosx-10.7-intel-2.7/factfiber/stat/pmodel/c/meer.so, 2): Symbol not found: _DQAGSE\n Referenced from: /Users/shauncutts/.pyxbld/lib.macosx-10.7-intel-2.7/factfiber/stat/pmodel/c/meer.so\n Expected in: flat namespace\n in /Users/shauncutts/.pyxbld/lib.macosx-10.7-intel-2.7/factfiber/stat/pmodel/c/meer.so\n']
Так что я думаю, что сосредоточил свою проблему на том, чтобы на самом деле «указать» мою ссылку на fortran QDAGSE на _quadpack.so в scipy.integrate.(NB пробовал и строчную версию.) ... без необходимости взламывать scipy, поместив туда pxd.Есть ли способ, которым я могу это сделать?Возможно динамически?(Могу ли я загрузить .so динамически и привязать соответствующий указатель на глобальную переменную?)
cdef extern from "stdlib.h":
void free(void* ptr)
void* malloc(size_t size)
void* realloc(void* ptr, size_t size)
ctypedef double (*qagfunc)( double* )
cdef extern:
# in scipy.integrate._quadpack
cdef void dqagse(
qagfunc f, double *a, double *b, double *epsabs, double *epsrel,
int *limit,
double *result, double *abserr, int *neval, int *ier,
double *alist, double *blist, double *rlist, double *elist,
int *iord, int *last
)
class QAGError( ValueError ):
code = None
cdef double qags(
qagfunc quad_function, double a, double b,
double epsabs=1.49e-8, double epsrel=1.49e-8,
int limit = 50
):
'''
wrapper for QUADPACK quags/quagse
'''
cdef double result, abserr
cdef int neval = 0, ier = 0, last = 0
cdef int *iord = <int *>malloc( limit * sizeof( double ) )
cdef double *alist = <double *>malloc( limit * sizeof( double ) )
cdef double *blist = <double *>malloc( limit * sizeof( double ) )
cdef double *rlist = <double *>malloc( limit * sizeof( double ) )
cdef double *elist = <double *>malloc( limit * sizeof( double ) )
try:
DQAGSE(
quad_function, &a, &b, &epsabs, &epsrel, &limit,
&result, &abserr, &neval, &ier,
alist, blist, rlist, elist, iord, &last);
finally:
free( iord )
free( alist )
free( blist )
free( rlist )
free( elist )
if ier > 0:
raise QAGError( QUAGS_IER_MAP[ ier ] )
return result