File: mlgsl_qrng.c

package info (click to toggle)
ocamlgsl 0.3.5-3
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 3,444 kB
  • ctags: 2,901
  • sloc: ml: 7,956; ansic: 6,796; makefile: 303; sh: 87; awk: 13
file content (64 lines) | stat: -rw-r--r-- 1,485 bytes parent folder | download
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;
}