Используете scikit-sparse's cholmod в оболочке Cython? - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь написать оболочку Cython для интерфейса с кодом C из Python.

Библиотека C использует CHOLMOD от Suitesparse, поэтому я решил установить scikit-sparse (который использует cholmod.pyx, который содержитвсе что мне нужно) было бы аккуратно. Тем не менее, я безуспешно искал решения для включения этих определений CHOLMOD, и я хотел бы избежать написания «своих» cholmod.pxd с typedefs структур, которые мне нужны.

В качестве минимального примера, скажем, яиметь заголовочный файл 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 или из другого источника) для использованияих так, как описано в моем файле определения?

...