_test_multivariate.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #include <Python.h>
  2. #include "math.h"
  3. const double PI = 3.141592653589793238462643383279502884;
  4. static double
  5. _multivariate_typical(int n, double *args)
  6. {
  7. return cos(args[1] * args[0] - args[2] * sin(args[0])) / PI;
  8. }
  9. static double
  10. _multivariate_indefinite(int n, double *args)
  11. {
  12. return -exp(-args[0]) * log(args[0]);
  13. }
  14. static double
  15. _multivariate_sin(int n, double *args)
  16. {
  17. return sin(args[0]);
  18. }
  19. static double
  20. _sin_0(double x, void *user_data)
  21. {
  22. return sin(x);
  23. }
  24. static double
  25. _sin_1(int ndim, double *x, void *user_data)
  26. {
  27. return sin(x[0]);
  28. }
  29. static double
  30. _sin_2(double x)
  31. {
  32. return sin(x);
  33. }
  34. static double
  35. _sin_3(int ndim, double *x)
  36. {
  37. return sin(x[0]);
  38. }
  39. typedef struct {
  40. char *name;
  41. void *ptr;
  42. } routine_t;
  43. static const routine_t routines[] = {
  44. {"_multivariate_typical", &_multivariate_typical},
  45. {"_multivariate_indefinite", &_multivariate_indefinite},
  46. {"_multivariate_sin", &_multivariate_sin},
  47. {"_sin_0", &_sin_0},
  48. {"_sin_1", &_sin_1},
  49. {"_sin_2", &_sin_2},
  50. {"_sin_3", &_sin_3}
  51. };
  52. static int create_pointers(PyObject *module)
  53. {
  54. PyObject *d, *obj = NULL;
  55. int i;
  56. d = PyModule_GetDict(module);
  57. if (d == NULL) {
  58. goto fail;
  59. }
  60. for (i = 0; i < sizeof(routines) / sizeof(routine_t); ++i) {
  61. obj = PyLong_FromVoidPtr(routines[i].ptr);
  62. if (obj == NULL) {
  63. goto fail;
  64. }
  65. if (PyDict_SetItemString(d, routines[i].name, obj)) {
  66. goto fail;
  67. }
  68. Py_DECREF(obj);
  69. obj = NULL;
  70. }
  71. Py_XDECREF(obj);
  72. return 0;
  73. fail:
  74. Py_XDECREF(obj);
  75. return -1;
  76. }
  77. #if PY_MAJOR_VERSION >= 3
  78. static struct PyModuleDef moduledef = {
  79. PyModuleDef_HEAD_INIT,
  80. "_test_multivariate",
  81. NULL,
  82. -1,
  83. NULL, /* Empty methods section */
  84. NULL,
  85. NULL,
  86. NULL,
  87. NULL
  88. };
  89. PyMODINIT_FUNC
  90. PyInit__test_multivariate(void)
  91. {
  92. PyObject *m;
  93. m = PyModule_Create(&moduledef);
  94. if (m == NULL) {
  95. return NULL;
  96. }
  97. if (create_pointers(m)) {
  98. Py_DECREF(m);
  99. return NULL;
  100. }
  101. return m;
  102. }
  103. #else
  104. PyMODINIT_FUNC
  105. init_test_multivariate(void)
  106. {
  107. PyObject *m;
  108. m = Py_InitModule("_test_multivariate", NULL);
  109. if (m == NULL) {
  110. return;
  111. }
  112. create_pointers(m);
  113. }
  114. #endif