私が抱えている問題は、GSL の確率変量 (RV) 生成関数が、次gsl_rng
のような引数の 1 つとして特別な構造体へのポインターを必要とすることです。
double gsl_rng_uniform (const gsl_rng * r); // generate uniform RVs
double gsl_ran_gaussian (const gsl_rng * r, double sigma); // generate Gaussian RVs
すべての RV 生成関数は、 で表される同じ「ランダム性のソース」を共有するためgsl_rng * r
、C での一般的な使用パターンは、gsl_rng * r
前もって構築し、その後、さまざまな確率変量生成関数を呼び出しr
て、最後に分解することです。
Python で CFFI を使用してネイティブ C 呼び出しを行い、モンテカルロ シミュレーション プログラムを高速化したいと考えています。私が今持っている問題はgsl_rng * r
、Python から呼び出すすべての RV 生成関数で共有されていることを確認しながら、Python 側から C ポインターを適切に「隠す」方法ですか?
PS私は、次のようにCythonでこれを達成する方法を知っています:
## demo.pyx --- a Cython file
## declaration of C functions and structs
cdef extern from "math.h":
double exp(double)
cdef extern from "gsl/gsl_rng.h":
ctypedef struct gsl_rng:
pass
ctypedef struct gsl_rng_type:
pass
const gsl_rng_type * gsl_rng_default
gsl_rng * gsl_rng_alloc (const gsl_rng_type *)
void gsl_rng_free (gsl_rng *)
double gsl_rng_uniform (const gsl_rng *)
cdef extern from "gsl/gsl_randist.h":
double gsl_ran_gaussian (const gsl_rng *, double)
## define a python function that generates RVs
def foo(double sigma):
cdef:
int i;
double s;
const gsl_rng_type * T = gsl_rng_default;
gsl_rng * r = gsl_rng_alloc(T)
for i in range(10):
s += gsl_ran_gaussian(r, sigma) + gsl_rng_uniform(r); ## share r
gsl_rng_free(r)
return s