Ошибка сегментации с python типами и кубатурным интегральным решателем - PullRequest
0 голосов
/ 21 января 2020

В моем коде python мне нужно много раз решать определенный интеграл, поэтому я реализовал этот интеграл в C, чтобы ускорить процесс. Наиболее простой способ использования этой функции в python - это использование ctypes. Однако при оценке функции в python возникает ошибка сегментации.

Я создал минимальный рабочий пример, чтобы показать ошибку. Я использую cubature для решения интеграла в C (см. https://github.com/stevengj/cubature), что, вероятно, является причиной ошибки сегментации. Файл mwe.c содержит следующее:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include "./Cubature/cubature.h"

// Gaussian function
int f(unsigned ndim, const double *x, void *fdata, unsigned fdim, double *fval) {

    double sigma = *((double *) fdata); // we can pass σ via fdata argument
    double sum = 0;

    unsigned i;
    for (i = 0; i < ndim; ++i) sum += x[i] * x[i];

    fval[0] = exp(-sigma * sum);

    return 0; // success*
}

double gauss (double sigma)
{
    // Integration limits, result and error
    double xmin[3] = {-2,-2,-2}, xmax[3] = {2,2,2}, val, err;

    // Compute integral
    hcubature( 1, f, &sigma, 3, xmin, xmax, 0, 0, 1e-4, ERROR_INDIVIDUAL, &val, &err);

    // return final result
    return val;
}

Это скомпилировано с использованием

gcc -fPIC -shared -o mwe.dll mwe.c "./Cubature/hcubature.c" 

в Windows 64-битной системе (G CC версия 7.4.0). Обратите внимание, что mwe работает при добавлении функции main и непосредственном создании исполняемого файла, только при включении этого в python возникает ошибка. Код python выглядит следующим образом:

# Import ctypes
from ctypes import *

# load C functions
MWE = CDLL('./mwe.dll')

# Set output to double
MWE.gauss.restype=c_double

# Print output
sigma=c_double(0.5)
print(MWE.gauss(sigma))

, который я запускаю с Python 3.7.4, чтобы получить вывод Segmentation fault.

У кого-нибудь есть идеи, где это произошла ошибка?

PS: я знаю, что существует кубатурный интерфейс python, который я мог бы использовать; тем не менее, фактический интеграл, который мне нужно решить, вычислительно более требователен, чем гауссовский, использованный в примере, и я ожидаю существенного ускорения при его полном вычислении в C.

PPS: я, конечно, не эксперт в C и python, и определенно новичок в ctypes.

...