2

私が抱えている問題は、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
4

0 に答える 0