File: Randist.i

package info (click to toggle)
libmath-gsl-perl 0.49-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 192,040 kB
  • sloc: ansic: 895,452; perl: 24,787; makefile: 12
file content (128 lines) | stat: -rw-r--r-- 5,374 bytes parent folder | download | duplicates (6)
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
%module "Math::GSL::Randist"
%include "typemaps.i"
%include "gsl_typemaps.i"
%include "renames.i"

void gsl_ran_dir_2d (const gsl_rng * r, double *OUTPUT, double *OUTPUT);
void gsl_ran_dir_2d_trig_method (const gsl_rng * r, double *OUTPUT, double *OUTPUT);
void gsl_ran_dir_3d (const gsl_rng * r, double *OUTPUT, double *OUTPUT, double *OUTPUT);
void gsl_ran_bivariate_gaussian (const gsl_rng * r, double sigma_x, double sigma_y, double rho, double *OUTPUT, double *OUTPUT);


%typemap(in) void * {
    AV *tempav;
    I32 len;
    int i,x;
    SV  **tv;

    if (!SvROK($input))
        croak("Argument $argnum is not a reference.");
    if (SvTYPE(SvRV($input)) != SVt_PVAV)
        croak("Argument $argnum is not an array.");

    tempav = (AV*)SvRV($input);
    len = av_len(tempav);
    $1 = (int **) malloc((len+2)*sizeof(int *));
    for (i = 0; i <= len; i++) {
        tv = av_fetch(tempav, i, 0);
        x  = SvIV(*tv);
        memset((int*)($1+i), x , 1);
        //printf("curr = %d\n", (int)($1+i) );
    }
};
%typemap(freearg) void * {
    free($1);
}

/* rename wrappers to original */

%ignore gsl_ran_dirichlet;
%rename (gsl_ran_dirichlet) gsl_ran_dirichlet_wrapper;
array_wrapper * gsl_ran_dirichlet_wrapper(const gsl_rng * r, size_t SIZE, const double ARRAY[]);

%ignore gsl_ran_dirichlet_pdf;
%rename (gsl_ran_dirichlet_pdf) gsl_ran_dirichlet_pdf_wrapper;
double gsl_ran_dirichlet_pdf_wrapper(size_t SIZE, const double ARRAY[], size_t SIZE, const double ARRAY[]);

%ignore gsl_ran_dirichlet_lnpdf;
%rename (gsl_ran_dirichlet_lnpdf) gsl_ran_dirichlet_lnpdf_wrapper;
double gsl_ran_dirichlet_lnpdf_wrapper(size_t SIZE, const double ARRAY[], size_t SIZE, const double ARRAY[]);

%ignore gsl_ran_multinomial;
%rename (gsl_ran_multinomial) gsl_ran_multinomial_wrapper;
array_wrapper * gsl_ran_multinomial_wrapper (const gsl_rng * r, size_t SIZE, const double ARRAY[], unsigned int N);

%ignore gsl_ran_multinomial_pdf;
%rename (gsl_ran_multinomial_pdf) gsl_ran_multinomial_pdf_wrapper;
double gsl_ran_multinomial_pdf_wrapper (size_t SIZE, const unsigned int ARRAY[], size_t SIZE, const double ARRAY[]);

%ignore gsl_ran_multinomial_lnpdf;
%rename (gsl_ran_multinomial_lnpdf) gsl_ran_multinomial_lnpdf_wrapper;
double gsl_ran_multinomial_lnpdf_wrapper (size_t SIZE, const unsigned int ARRAY[], size_t SIZE, const double ARRAY[]);

%ignore gsl_ran_dir_nd;
%rename (gsl_ran_dir_nd) gsl_ran_dir_nd_wrapper;
array_wrapper * gsl_ran_dir_nd_wrapper (const gsl_rng * r, size_t n);

%{
    #include "gsl/gsl_matrix.h"
    #include "gsl/gsl_vector.h"
    #include "gsl/gsl_randist.h"
    #include "../c/Randist.c"

    /* create wrappers for multinormial and dirichlet */

    /* void gsl_ran_dirichlet (const gsl_rng * r, size_t K, const double alpha[], double theta[]) */
    array_wrapper * gsl_ran_dirichlet_wrapper(const gsl_rng * r, size_t K, const double alpha[]){
        array_wrapper * wrapper = array_wrapper_alloc(K, awDouble);
        gsl_ran_dirichlet(r, wrapper->size, alpha, (double*)(wrapper->data));
        return wrapper;
    }
    /* double gsl_ran_dirichlet_pdf (size_t K, const double alpha[], const double theta[]) */
    double gsl_ran_dirichlet_pdf_wrapper(size_t K1, const double theta[], size_t K2, const double alpha[]){
        if (K1 != K2)
            croak("gsl_ran_dirichlet_pdf - arrays need to be same size");
        return gsl_ran_dirichlet_pdf (K1, alpha, theta);
    }
    /* double gsl_ran_dirichlet_lnpdf (size_t K, const double alpha[], const double theta[]) */
    double gsl_ran_dirichlet_lnpdf_wrapper(size_t K1, const double theta[], size_t K2, const double alpha[]){
        if (K1 != K2)
            croak("gsl_ran_dirichlet_lnpdf - arrays need to be same size");
        return gsl_ran_dirichlet_lnpdf (K1, alpha, theta);
    }

    /* void gsl_ran_multinomial (const gsl_rng * r, size_t K, unsigned int N, const double p[], unsigned int n[]) */
    array_wrapper * gsl_ran_multinomial_wrapper (const gsl_rng * r, size_t K, const double p[], unsigned int N){
        array_wrapper * wrapper = array_wrapper_alloc(K, awUnsigned);
        gsl_ran_multinomial(r, wrapper->size, N, p, (unsigned int*)(wrapper->data));
        return wrapper;
    }
    /* double gsl_ran_multinomial_pdf (size_t K, const double p[], const unsigned int n[]) */
    double gsl_ran_multinomial_pdf_wrapper (size_t K1, const unsigned int n[], size_t K2, const double p[]){
        if (K1 != K2)
            croak("gsl_ran_multinomial_pdf - arrays need to be same size");
        return gsl_ran_multinomial_pdf (K1, p, n);
    }
    /* double gsl_ran_multinomial_lnpdf (size_t K, const double p[], const unsigned int n[]) */
    double gsl_ran_multinomial_lnpdf_wrapper (size_t K1, const unsigned int n[], size_t K2, const double p[]){
        if (K1 != K2)
            croak("gsl_ran_multinomial_lnpdf - arrays need to be same size");
        return gsl_ran_multinomial_lnpdf (K1, p, n);
    }

    /* void gsl_ran_dir_nd (const gsl_rng * r, size_t n, double * x) */
    array_wrapper * gsl_ran_dir_nd_wrapper (const gsl_rng * r, size_t n) {
        array_wrapper * wrapper = array_wrapper_alloc(n, awDouble);
        gsl_ran_dir_nd(r, n, (double*)(wrapper->data));
        return wrapper;
    }

%}

%include "gsl/gsl_matrix.h"
%include "gsl/gsl_vector.h"
%include "gsl/gsl_randist.h"
%include "../c/Randist.h"
%include "../pod/Randist.pod"