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
|
/* ocamlgsl - OCaml interface to GSL */
/* Copyright () 2002 - Olivier Andrieu */
/* distributed under the terms of the GPL version 2 */
#include <gsl/gsl_qrng.h>
#include "wrappers.h"
static inline const gsl_qrng_type *qrngtype_val(value v)
{
const gsl_qrng_type *qrng_type[] = {
gsl_qrng_niederreiter_2,
gsl_qrng_sobol };
return qrng_type[Int_val(v)];
}
#define Qrng_val(v) (gsl_qrng *)Field((v), 0)
value ml_gsl_qrng_alloc(value type, value dim)
{
value r;
Abstract_ptr(r, gsl_qrng_alloc(qrngtype_val(type), Int_val(dim)));
return r;
}
ML1(gsl_qrng_free, Qrng_val, Unit)
ML1(gsl_qrng_init, Qrng_val, Unit)
value ml_gsl_qrng_dimension(value qrng)
{
return Val_int((Qrng_val(qrng))->dimension);
}
value ml_gsl_qrng_get(value qrng, value x)
{
if(Double_array_length(x) != (Qrng_val(qrng))->dimension)
GSL_ERROR("wrong array size", GSL_EBADLEN);
gsl_qrng_get(Qrng_val(qrng), Double_array_val(x));
return Val_unit;
}
value ml_gsl_qrng_sample(value qrng)
{
gsl_qrng * q = Qrng_val(qrng);
value arr = alloc(q->dimension * Double_wosize, Double_array_tag);
gsl_qrng_get(q, Double_array_val(arr));
return arr;
}
ML1(gsl_qrng_name, Qrng_val, copy_string)
value ml_gsl_qrng_memcpy(value src, value dst)
{
gsl_qrng_memcpy(Qrng_val(dst), Qrng_val(src));
return Val_unit;
}
value ml_gsl_qrng_clone(value qrng)
{
value r;
Abstract_ptr(r, gsl_qrng_clone(Qrng_val(qrng)));
return r;
}
|