使用cffi函数和scipy.integrate.nquad

时间:2018-01-31 23:09:02

标签: scipy python-cffi

我不能让scipy.integrate.nquad使用cffi函数。 我也找不到这个在线的例子。

假设我的test.py中有一个简单的c函数

ffibuilder.set_source("_test",     
    r""" #include <math.h>
        double test(int n, double* xx) {
            return xx[0]*xx[1];
        }
     """)

我试图将它集成到第二个文件test_cffi.py中,如此

from _test import ffi, lib
from scipy.integrate import nquad

xx = ffi.new("double[]",2)
xx[0] = 1
xx[1] = 2
# This works.
print(lib.test(2,xx))
# This I can't make to work
print(nquad(lib.test3,[[0,1],[0,1]],args=(2,)))

我应该在上一行做什么才能使整合工作? Scipy文档说函数签名必须是双f(int,double *)。

1 个答案:

答案 0 :(得分:1)

该文档讨论了如何接受 ctypes 函数,它可能是nquad()内的特殊内容。它没有提及 cffi 函数,这意味着没有特别的支持。

您可以尝试获取C级函数的地址并将其手动包装在ctypes函数中,以便nquad()再次打开它并直接调用C函数:

raw_addr = int(ffi.cast("intptr_t", ffi.addressof(lib, "test")))
CF = ctypes.CFUNCTYPE(ctypes.c_double,
         ctypes.c_int, ctypes.POINTER(ctypes.c_double))
wrapper_function = CF(raw_addr)