package bimage

  1. Overview
  2. Docs

Source file data.ml

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
129
open Bigarray
open Type

type ('a, 'b) t = ('a, 'b, c_layout) Array1.t

let[@inline] kind t = Array1.kind t

let create kind n =
  let arr =
    Bigarray.Array1.create kind Bigarray.C_layout n
  in
  Array1.fill arr (Kind.of_float kind 0.0);
  arr


let random kind n =
  let dest = create kind n in
  for i = 0 to n - 1 do
    Bigarray.Array1.set dest i
      (Kind.of_float kind (Random.float (Kind.max kind)))
  done;
  dest


let[@inline] length data = Array1.dim data

let fold2 f a b init =
  let acc = ref init in
  for i = 0 to length a - 1 do
    acc := f (Bigarray.Array1.get a i) (Bigarray.Array1.get b i) !acc
  done;
  !acc


let fold f a init =
  let acc = ref init in
  for i = 0 to length a - 1 do
    acc := f (Bigarray.Array1.get a i) !acc
  done;
  !acc


let hash a = Hashtbl.hash a

let compare a b = compare a b

let equal a b = compare a b = 0

let of_float ?dest t arr =
  let of_float = Kind.of_float t in
  let size = length arr in
  let dest =
    match dest with
    | None ->
        create t size
    | Some d ->
        d
  in
  for i = 0 to size - 1 do
    Bigarray.Array1.set dest i (of_float (Bigarray.Array1.get arr i))
  done;
  dest


let to_float ?dest arr =
  let to_float = Kind.to_float (kind arr) in
  let size = length arr in
  let dest =
    match dest with
    | None ->
        create f32 size
    | Some d ->
        d
  in
  for i = 0 to size - 1 do
    Bigarray.Array1.set dest i (to_float (Bigarray.Array1.get arr i))
  done;
  dest


let of_array t arr = Array1.of_array t C_layout arr

let to_array data =
  let size = length data in
  let arr = Array.make size (Bigarray.Array1.get data 0) in
  for i = 0 to size - 1 do
    arr.(i) <- Bigarray.Array1.get data i
  done;
  arr


let fill = Bigarray.Array1.fill

let slice ~offs ~length d = Bigarray.Array1.sub d offs length

let map_inplace f a =
  for i = 0 to length a - 1 do
    Bigarray.Array1.set a i (f (Bigarray.Array1.get a i))
  done


let map2_inplace f a b =
  for i = 0 to length a - 1 do
    Bigarray.Array1.set a i
      (f (Bigarray.Array1.get a i) (Bigarray.Array1.get b i))
  done


let copy_to ~dest src = Bigarray.Array1.blit src dest

let copy data =
  let dest = create (Bigarray.Array1.kind data) (length data) in
  copy_to ~dest data; dest


let convert_to fn ~dest data =
  let len = length data in
  for i = 0 to len - 1 do
    Bigarray.Array1.set dest i (fn (Bigarray.Array1.get data i))
  done


let convert kind fn data =
  let len = length data in
  let dst = create kind len in
  for i = 0 to len - 1 do
    Bigarray.Array1.set dst i (fn (Bigarray.Array1.get data i))
  done;
  dst