1
/* ocamlgsl - OCaml interface to GSL */
2
/* Copyright (�) 2002 - Olivier Andrieu */
3
/* distributed under the terms of the GPL version 2 */
6
#include <gsl/gsl_permutation.h>
7
#include <gsl/gsl_permute.h>
10
#include "mlgsl_error.h"
11
#include "mlgsl_permut.h"
13
value ml_gsl_permutation_init(value p)
15
GSL_PERMUT_OF_BIGARRAY(p);
16
gsl_permutation_init(&perm_p);
20
value ml_gsl_permutation_valid(value p)
23
GSL_PERMUT_OF_BIGARRAY(p);
24
r = gsl_permutation_valid(&perm_p);
25
return Val_negbool(r);
28
value ml_gsl_permutation_reverse(value p)
30
GSL_PERMUT_OF_BIGARRAY(p);
31
gsl_permutation_reverse(&perm_p);
35
value ml_gsl_permutation_inverse(value src, value dst)
37
GSL_PERMUT_OF_BIGARRAY(src);
38
GSL_PERMUT_OF_BIGARRAY(dst);
39
gsl_permutation_inverse(&perm_dst, &perm_src);
43
value ml_gsl_permutation_next(value p)
45
GSL_PERMUT_OF_BIGARRAY(p);
46
gsl_permutation_next(&perm_p);
50
value ml_gsl_permutation_prev(value p)
52
GSL_PERMUT_OF_BIGARRAY(p);
53
gsl_permutation_prev(&perm_p);
57
value ml_gsl_permute(value p, value arr)
59
GSL_PERMUT_OF_BIGARRAY(p);
60
if(Tag_val(arr) == Double_array_tag)
61
gsl_permute(perm_p.data, Double_array_val(arr), 1,
62
Double_array_length(arr));
64
gsl_permute_long(perm_p.data, (value *)arr, 1, Array_length(arr));
68
value ml_gsl_permute_barr(value p, value arr)
70
GSL_PERMUT_OF_BIGARRAY(p);
71
struct caml_bigarray *barr = Bigarray_val(arr);
72
enum caml_bigarray_kind kind = (barr->flags) & BIGARRAY_KIND_MASK ;
74
case BIGARRAY_FLOAT32:
75
gsl_permute_float(perm_p.data, barr->data, 1, barr->dim[0]); break;
76
case BIGARRAY_FLOAT64:
77
gsl_permute(perm_p.data, barr->data, 1, barr->dim[0]); break;
79
gsl_permute_char(perm_p.data, barr->data, 1, barr->dim[0]); break;
81
gsl_permute_uchar(perm_p.data, barr->data, 1, barr->dim[0]); break;
83
gsl_permute_short(perm_p.data, barr->data, 1, barr->dim[0]); break;
85
gsl_permute_ushort(perm_p.data, barr->data, 1, barr->dim[0]); break;
91
case BIGARRAY_CAML_INT:
92
case BIGARRAY_NATIVE_INT:
93
gsl_permute_long(perm_p.data, barr->data, 1, barr->dim[0]); break;
94
case BIGARRAY_COMPLEX32:
95
gsl_permute_complex_float(perm_p.data, barr->data, 1, barr->dim[0]); break;
96
case BIGARRAY_COMPLEX64:
97
gsl_permute_complex(perm_p.data, barr->data, 1, barr->dim[0]); break;
99
MLGSLexn("data type not supported", GSL_EUNIMPL);
104
value ml_gsl_permute_complex(value p, value arr)
106
GSL_PERMUT_OF_BIGARRAY(p);
107
gsl_permute_complex(perm_p.data, Double_array_val(arr), 1,
108
Double_array_length(arr)/2);
112
value ml_gsl_permute_inverse(value p, value arr)
114
GSL_PERMUT_OF_BIGARRAY(p);
115
if(Tag_val(arr) == Double_array_tag)
116
gsl_permute_inverse(perm_p.data, Double_array_val(arr), 1,
117
Double_array_length(arr));
119
gsl_permute_long_inverse(perm_p.data, (value *)arr, 1, Array_length(arr));
123
value ml_gsl_permute_inverse_barr(value p, value arr)
125
GSL_PERMUT_OF_BIGARRAY(p);
126
struct caml_bigarray *barr = Bigarray_val(arr);
127
enum caml_bigarray_kind kind = (barr->flags) & BIGARRAY_KIND_MASK ;
129
case BIGARRAY_FLOAT32:
130
gsl_permute_float_inverse(perm_p.data, barr->data, 1, barr->dim[0]); break;
131
case BIGARRAY_FLOAT64:
132
gsl_permute_inverse(perm_p.data, barr->data, 1, barr->dim[0]); break;
134
gsl_permute_char_inverse(perm_p.data, barr->data, 1, barr->dim[0]); break;
136
gsl_permute_uchar_inverse(perm_p.data, barr->data, 1, barr->dim[0]); break;
137
case BIGARRAY_SINT16:
138
gsl_permute_short_inverse(perm_p.data, barr->data, 1, barr->dim[0]); break;
139
case BIGARRAY_UINT16:
140
gsl_permute_ushort_inverse(perm_p.data, barr->data, 1, barr->dim[0]); break;
141
#ifdef ARCH_SIXTYFOUR
146
case BIGARRAY_CAML_INT:
147
case BIGARRAY_NATIVE_INT:
148
gsl_permute_long_inverse(perm_p.data, barr->data, 1, barr->dim[0]); break;
149
case BIGARRAY_COMPLEX32:
150
gsl_permute_complex_float_inverse(perm_p.data, barr->data, 1, barr->dim[0]); break;
151
case BIGARRAY_COMPLEX64:
152
gsl_permute_complex_inverse(perm_p.data, barr->data, 1, barr->dim[0]); break;
154
MLGSLexn("data type not supported", GSL_EUNIMPL);
159
value ml_gsl_permute_inverse_complex(value p, value arr)
161
GSL_PERMUT_OF_BIGARRAY(p);
162
gsl_permute_complex_inverse(perm_p.data, Double_array_val(arr), 1,
163
Double_array_length(arr)/2);