#include <Python.h>
#include "math.h"
const double PI = 3.141592653589793238462643383279502884;
static double
_multivariate_typical(int n, double *args)
{
return cos(args[1] * args[0] - args[2] * sin(args[0])) / PI;
}
static double
_multivariate_indefinite(int n, double *args)
{
return -exp(-args[0]) * log(args[0]);
}
static double
_multivariate_sin(int n, double *args)
{
return sin(args[0]);
}
static double
_sin_0(double x, void *user_data)
{
return sin(x);
}
static double
_sin_1(int ndim, double *x, void *user_data)
{
return sin(x[0]);
}
static double
_sin_2(double x)
{
return sin(x);
}
static double
_sin_3(int ndim, double *x)
{
return sin(x[0]);
}
typedef struct {
char *name;
void *ptr;
} routine_t;
static const routine_t routines[] = {
{"_multivariate_typical", &_multivariate_typical},
{"_multivariate_indefinite", &_multivariate_indefinite},
{"_multivariate_sin", &_multivariate_sin},
{"_sin_0", &_sin_0},
{"_sin_1", &_sin_1},
{"_sin_2", &_sin_2},
{"_sin_3", &_sin_3}
};
static int create_pointers(PyObject *module)
{
PyObject *d, *obj = NULL;
int i;
d = PyModule_GetDict(module);
if (d == NULL) {
goto fail;
}
for (i = 0; i < sizeof(routines) / sizeof(routine_t); ++i) {
obj = PyLong_FromVoidPtr(routines[i].ptr);
if (obj == NULL) {
goto fail;
}
if (PyDict_SetItemString(d, routines[i].name, obj)) {
goto fail;
}
Py_DECREF(obj);
obj = NULL;
}
Py_XDECREF(obj);
return 0;
fail:
Py_XDECREF(obj);
return -1;
}
#if PY_MAJOR_VERSION >= 3
static struct PyModuleDef moduledef = {
PyModuleDef_HEAD_INIT,
"_test_multivariate",
NULL,
-1,
NULL, /* Empty methods section */
NULL,
NULL,
NULL,
NULL
};
PyMODINIT_FUNC
PyInit__test_multivariate(void)
{
PyObject *m;
m = PyModule_Create(&moduledef);
if (m == NULL) {
return NULL;
}
if (create_pointers(m)) {
Py_DECREF(m);
return NULL;
}
return m;
}
#else
PyMODINIT_FUNC
init_test_multivariate(void)
{
PyObject *m;
m = Py_InitModule("_test_multivariate", NULL);
if (m == NULL) {
return;
}
create_pointers(m);
}
#endif