Как взаимодействовать с указателями CFFI Void внутри Numba - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть библиотека C, которая взаимодействует с CFFI, как со следующими определениями:

import cffi
ffi = cffi.FFI()

ffi.cdef("""
typedef struct zkdtree  zkdtree;
typedef struct zkdtree_result zkdtree_result;


zkdtree * zkdtree_load(const char * filename, char ** errout);

void zkdtree_delete(zkdtree *);

size_t zkdtree_nfeatures(zkdtree *);

double zkdtree_interpolate(zkdtree *, double * pt);

zkdtree_result * zkdtree_result_allocate(void);

void zkdtree_result_delete(zkdtree_result *);

void zkdtree_point_info(zkdtree *, double * pt, zkdtree_result * output);

bool zkdtree_result_interpolable(zkdtree_result *);

double zkdtree_result_central_value(zkdtree_result *);

double zkdtree_result_variance(zkdtree_result *);

""")

Обратите внимание, что на внутреннюю структуру таких вещей, как zkdtree, никогда не ссылаются.

На данный момент я загружаю динамическую библиотеку, которая содержит соответствующие символы:

C = ffi.dlopen("libcapi.so")

Я хотел бы иметь возможность вызывать эти функции внутри функции jumba jipped (в режиме nopython) и обмениваться различными анонимными структурами(как zkdtree).Я видел модуль numba.cffi_support, но, похоже, не знаю, как научить его понимать мои определения.

Я безуспешно пытался с различными вариациями вокруг

tree_load = C.zkdtree_load
err = ffi.new('char **')
interp = C.zkdtree_interpolate
cffi_support.register_type(ffi.typeof(tree), numba.void)


@numba.njit
def test_one_point():
    tree = tree_load(b"nlo.tree", err)
    interp(tree, [0.,0.,0.,0.])

, но у меня естьне удалось заставить его работать с tree и err.Я получаю ошибки, такие как

TypeError: Failed in nopython mode pipeline (step: nopython frontend)
<ctype 'zkdtree'>
...