new version of python interface
This commit is contained in:
119
packages/python/pl2pl.c
Normal file
119
packages/python/pl2pl.c
Normal file
@@ -0,0 +1,119 @@
|
||||
|
||||
#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);
|
||||
}
|
Reference in New Issue
Block a user