1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
#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
|