120 lines
2.9 KiB
C
120 lines
2.9 KiB
C
|
|
#include "python.h"
|
|
|
|
static foreign_t array_to_python_list(term_t addr, term_t type, term_t szt,
|
|
term_t py) {
|
|
void *src;
|
|
Py_ssize_t sz, i;
|
|
int is_float;
|
|
|
|
if (!PL_get_pointer(addr, &src) || !PL_get_bool(type, &is_float) ||
|
|
!PL_get_intptr(szt, &sz))
|
|
return false;
|
|
PyObject *list = PyList_New(sz);
|
|
if (!list)
|
|
return false;
|
|
if (is_float) {
|
|
double *v = (double *)src;
|
|
for (i = 0; i < sz; i++) {
|
|
PyObject *x = PyFloat_FromDouble(v[i]);
|
|
PyList_SET_ITEM(list, i, x);
|
|
}
|
|
} else {
|
|
YAP_Int *v = (YAP_Int *)src;
|
|
for (i = 0; i < sz; i++) {
|
|
PyObject *x = PyFloat_FromDouble(v[i]);
|
|
PyList_SET_ITEM(list, i, x);
|
|
}
|
|
}
|
|
if (PL_is_variable(py)) {
|
|
return python_to_ptr(list, py);
|
|
}
|
|
return assign_to_symbol(py, list);
|
|
}
|
|
|
|
static foreign_t array_to_python_tuple(term_t addr, term_t type, term_t szt,
|
|
term_t py) {
|
|
void *src;
|
|
Py_ssize_t sz, i;
|
|
int is_float;
|
|
|
|
if (!PL_get_pointer(addr, &src) || !PL_get_bool(type, &is_float) ||
|
|
!PL_get_intptr(szt, &sz))
|
|
return false;
|
|
PyObject *list = PyTuple_New(sz);
|
|
if (!list)
|
|
return false;
|
|
if (is_float) {
|
|
double *v = (double *)src;
|
|
|
|
for (i = 0; i < sz; i++) {
|
|
PyObject *x;
|
|
x = PyFloat_FromDouble(v[i]);
|
|
if (PyTuple_SetItem(list, i, x)) {
|
|
PyErr_Print();
|
|
return FALSE;
|
|
}
|
|
}
|
|
} else {
|
|
int32_t *v = (int32_t *)src;
|
|
PyObject *x;
|
|
for (i = 0; i < sz; i++) {
|
|
#if PY_MAJOR_VERSION < 3
|
|
x = PyInt_FromLong(v[i]);
|
|
#else
|
|
x = PyLong_FromLong(v[i]);
|
|
#endif
|
|
if (PyTuple_SetItem(list, i, x)) {
|
|
PyErr_Print();
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
if (PL_is_variable(py)) {
|
|
return python_to_ptr(list, py);
|
|
}
|
|
return assign_to_symbol(py, list);
|
|
}
|
|
|
|
static foreign_t array_to_python_view(term_t addr, term_t type, term_t szt,
|
|
term_t colt, term_t py) {
|
|
void *src;
|
|
Py_ssize_t sz, rows;
|
|
int is_float;
|
|
Py_ssize_t shape[2];
|
|
|
|
if (!PL_get_pointer(addr, &src) || !PL_get_bool(type, &is_float) ||
|
|
!PL_get_intptr(szt, &sz) || !PL_get_intptr(colt, &rows))
|
|
return false;
|
|
Py_buffer buf;
|
|
buf.buf = src;
|
|
if (is_float) {
|
|
buf.len = sz * sizeof(double);
|
|
buf.itemsize = sizeof(double);
|
|
} else {
|
|
buf.len = sz * sizeof(YAP_Int);
|
|
buf.itemsize = sizeof(YAP_Int);
|
|
}
|
|
buf.readonly = false;
|
|
buf.format = NULL;
|
|
buf.ndim = 2;
|
|
buf.shape = shape;
|
|
buf.strides = NULL;
|
|
buf.suboffsets = NULL;
|
|
PyObject *o = PyMemoryView_FromBuffer(&buf);
|
|
if (!o) {
|
|
PyErr_Print();
|
|
return false;
|
|
}
|
|
if (PL_is_variable(py)) {
|
|
return python_to_ptr(o, py);
|
|
}
|
|
return assign_to_symbol(py, o);
|
|
}
|
|
|
|
install_t install_pl2pl(void) {
|
|
PL_register_foreign("array_to_python_list", 4, array_to_python_list, 0);
|
|
PL_register_foreign("array_to_python_tuple", 4, array_to_python_tuple, 0);
|
|
PL_register_foreign("array_to_python_view", 5, array_to_python_view, 0);
|
|
}
|