在cython包装器中使用scikit-sparse的cholmod吗?

时间:2019-10-09 07:47:06

标签: python cython scikits suitesparse

我正试图编写一个Cython包装器,以从Python接口C代码。

C库利用了Suitesparse的CHOLMOD,因此我认为安装scikit-sparse(使用包含我需要的一切的cholmod.pyx)是一种好方法。 但是,我没有找到包含CHOLMOD的这些定义的解决方案,并且我想避免用我需要的结构的typedef编写“我自己的” cholmod.pxd

作为一个最小的示例,假设我有一个foo.h头文件,该文件定义了一个结构,该结构又包含一些CHOLMOD结构以及一些虚函数。我的Cython定义文件如下所示:

cdef extern from "foo.h":
    ctypedef struct foostruct:
        cholmod_common c
        cholmod_factor *f
        cholmod_dense *d

    void initialize_foostruct(foostruct* bar)
    void modify_foostruct(foostruct* bar)

实施可以例如是:

from libc.stdlib cimport calloc, malloc, free
from foo cimport *

cdef class Foo:
    cdef foostruct* _bar

    def __cinit__(self):
        self._bar = <foostruct*> calloc(1, sizeof(foostruct))
        if self._bar is NULL:
            raise MemoryError()
        initialize_foostruct(self._bar)

    def __dealloc__(self):
        if self._bar is not NULL:
            free(self._bar)
            self._bar = NULL

    def do_something(self):
        modify_foostruct(self._bar)

显然,这将失败,因为定义文件中未知cholmod_common等(错误读取'cholmod_common' is not a type identifier)。我尝试了类似from sksparse.cholmod cimport *之类的方法,但无济于事...

是否可以以某种方式(从scikit-sparse或其他来源)导入那些类型标识符以按照我的定义文件中所述的方式使用它们?

0 个答案:

没有答案