-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathArrayFire.hs
More file actions
340 lines (323 loc) · 7.49 KB
/
ArrayFire.hs
File metadata and controls
340 lines (323 loc) · 7.49 KB
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
--------------------------------------------------------------------------------
-- |
-- Module : ArrayFire
-- Copyright : David Johnson (c) 2019-2020
-- License : BSD3
-- Maintainer : David Johnson <code@dmj.io>
-- Stability : Experimental
-- Portability : GHC
--
-- <<https://user-images.githubusercontent.com/875324/59819703-0fbaf980-92f7-11e9-8f53-adebea590bfb.png>>
--
--------------------------------------------------------------------------------
module ArrayFire
( -- * Tutorial
-- $tutorial
-- ** Modules
-- $modules
-- ** Exceptions
-- $exceptions
-- ** Construction
-- $construction
-- ** Laws
-- $laws
-- ** Conversion
-- $conversion
-- ** Serialization
-- $serialization
-- ** Device
-- $device
module ArrayFire.Algorithm
, module ArrayFire.Arith
, module ArrayFire.Array
, module ArrayFire.Backend
, module ArrayFire.BLAS
, module ArrayFire.Data
, module ArrayFire.Device
, module ArrayFire.Features
, module ArrayFire.Graphics
, module ArrayFire.Image
, module ArrayFire.Index
, module ArrayFire.LAPACK
, module ArrayFire.Random
, module ArrayFire.Signal
, module ArrayFire.Sparse
, module ArrayFire.Statistics
, module ArrayFire.Types
, module ArrayFire.Util
, module ArrayFire.Vision
, module Foreign.C.Types
, module Data.Int
, module Data.Word
, module Data.Complex
, module Foreign.Storable
) where
import ArrayFire.Algorithm
import ArrayFire.Arith
import ArrayFire.Array
import ArrayFire.Backend
import ArrayFire.BLAS
import ArrayFire.Data
import ArrayFire.Device
import ArrayFire.Features
import ArrayFire.Graphics
import ArrayFire.Image
import ArrayFire.Index
import ArrayFire.LAPACK
import ArrayFire.Random
import ArrayFire.Signal
import ArrayFire.Sparse
import ArrayFire.Statistics
import ArrayFire.Types
import ArrayFire.Util
import ArrayFire.Vision
import ArrayFire.Orphans ()
import Foreign.Storable
import Foreign.C.Types
import Data.Int
import Data.Complex
import Data.Word
-- $tutorial
--
-- [ArrayFire](http://arrayfire.org/docs/gettingstarted.htm) is a high performance parallel computing library that features modules for statistical and numerical methods.
-- Example usage is depicted below.
--
-- @
-- module Main where
--
-- import qualified ArrayFire as A
--
-- main :: IO ()
-- main = print $ A.matrix @Double (3,2) [[1,2,3],[4,5,6]]
-- @
--
-- Each 'Array' is constructed and displayed in column-major order.
--
-- @
-- ArrayFire Array
-- [3 2 1 1]
-- 1.0000 4.0000
-- 2.0000 5.0000
-- 3.0000 6.0000
-- @
-- $modules
--
-- All child modules are re-exported top-level in the "ArrayFire" module.
-- We recommend importing "ArrayFire" qualified so as to avoid naming collisions.
--
-- >>> import qualified ArrayFire as A
--
-- $exceptions
--
-- @
-- {\-\# LANGUAGE TypeApplications \#\-}
-- module Main where
--
-- import qualified ArrayFire as A
-- import Control.Exception ( catch )
--
-- main :: IO ()
-- main = A.printArray action \`catch\` (\\(e :: A.AFException) -> print e)
-- where
-- action =
-- A.matrix \@Double (3,3) [[1..],[1..],[1..]]
-- \`A.mul\` A.matrix \@Double (2,2) [[1..],[1..]]
-- @
--
-- The above operation is invalid since the matrix multiply has improper dimensions. The caught exception produces the following error:
--
-- > AFException {afExceptionType = SizeError, afExceptionCode = 203, afExceptionMsg = "Invalid input size"}
--
-- $construction
-- An 'Array' can be constructed using the following smart constructors:
--
-- /Note/: All smart constructors (and ArrayFire internally) assume column-major order.
--
-- @
-- >>> scalar \@Double 2.0
-- ArrayFire Array
-- [1 1 1 1]
-- 2.0000
-- @
--
-- @
-- >>> vector \@Double 10 [1..]
-- ArrayFire Array
-- [10 1 1 1]
-- 1.0000
-- 2.0000
-- 3.0000
-- 4.0000
-- 5.0000
-- 6.0000
-- 7.0000
-- 8.0000
-- 9.0000
-- 10.0000
-- @
--
-- @
-- >>> matrix \@Double (2,2) [[1,2],[3,4]]
-- ArrayFire Array
-- [2 2 1 1]
-- 1.0000 3.0000
-- 2.0000 4.0000
-- @
--
-- @
-- >>> cube \@Double (2,2,2) [[[2,2],[2,2]],[[2,2],[2,2]]]
-- ArrayFire Array
-- [2 2 2 1]
-- 2.0000 2.0000
-- 2.0000 2.0000
--
-- 2.0000 2.0000
-- 2.0000 2.0000
-- @
--
-- @
-- >>> tensor \@Double (2,2,2,2) [[[[2,2],[2,2]],[[2,2],[2,2]]], [[[2,2],[2,2]],[[2,2],[2,2]]]]
-- ArrayFire Array
-- [2 2 2 2]
-- 2.0000 2.0000
-- 2.0000 2.0000
--
-- 2.0000 2.0000
-- 2.0000 2.0000
--
--
-- 2.0000 2.0000
-- 2.0000 2.0000
--
-- 2.0000 2.0000
-- 2.0000 2.0000
-- @
--
-- Array construction can use Haskell's lazy lists, since 'take' is called on each dimension before sending to the C API.
--
-- >>> mkArray @Double [5,3] [1..]
-- ArrayFire Array
-- [5 3 1 1]
-- 1.0000 6.0000 11.0000
-- 2.0000 7.0000 12.0000
-- 3.0000 8.0000 13.0000
-- 4.0000 9.0000 14.0000
-- 5.0000 10.0000 15.0000
--
-- Specifying up to 4 dimensions is allowed (anything higher is ignored).
-- $laws
-- Every 'Array' has an instance of 'Eq', 'Num', 'Fractional', 'Floating' and 'Show'
--
-- 'Num'
--
-- >>> 2.0 :: Array Double
-- ArrayFire Array
-- [1 1 1 1]
-- 2.0000
--
-- >>> scalar @Int 1 + scalar @Int 1
-- ArrayFire Array
-- [1 1 1 1]
-- 2
--
-- >>> scalar @Int 1 - scalar @Int 1
-- ArrayFire Array
-- [1 1 1 1]
-- 0
--
-- >>> scalar @Double 10 / scalar @Double 10
-- ArrayFire Array
-- [1 1 1 1]
-- 1.0000
--
-- >>> abs $ scalar @Double (-10)
-- ArrayFire Array
-- [1 1 1 1]
-- 10.0000
--
-- >>> negate (scalar @Double 10)
-- ArrayFire Array
-- [1 1 1 1]
-- -10.0000
--
-- >>> fromInteger 1.0 :: Array Double
-- ArrayFire Array
-- [1 1 1 1]
-- 1.0000
--
-- 'Eq'
--
-- >>> scalar @Double 1 [10] == scalar @Double 1 [10]
-- True
-- >>> scalar @Double 1 [10] /= scalar @Double 1 [10]
-- False
--
-- 'Floating'
--
-- >>> pi :: Array Double
-- ArrayFire Array
-- [1 1 1 1]
-- 3.1416
--
-- >>> A.sqrt pi :: Array Double
-- ArrayFire Array
-- [1 1 1 1]
-- 1.7725
--
-- 'Fractional'
--
-- >>> (pi :: Array Double) / pi
-- ArrayFire Array
-- [1 1 1 1]
-- 1.000
--
-- >>> recip 0.5 :: Array Double
-- ArrayFire Array
-- [1 1 1 1]
-- 2.000
--
-- 'Show'
--
-- >>> 0.0 :: Array Double
-- ArrayFire Array
-- [1 1 1 1]
-- 0.000
--
-- $conversion
-- Any 'Array' can be exported into Haskell using `toVector'. This will create a Storable vector suitable for use in other C programs.
--
-- >>> vector :: Vector Double <- toVector <$> randu @Double [10,10]
--
-- $serialization
-- Each 'Array' can be serialized to disk and deserialized from disk efficiently.
--
-- @
-- import qualified ArrayFire as A
-- import Control.Monad
--
-- main :: IO ()
-- main = do
-- let arr = A.'constant' [1,1,1,1] 10
-- idx <- A.'saveArray' "key" arr "file.array" False
-- foundIndex <- A.'readArrayKeyCheck' "file.array" "key"
-- when (idx == foundIndex) $ do
-- array <- A.'readArrayKey' "file.array" "key"
-- 'print' array
--
-- -- ArrayFire Array
-- -- [ 1 1 1 1 ]
-- -- 10
-- @
--
-- $device
-- The ArrayFire API is able to see which devices are present, and will by default use the GPU if available.
--
-- >>> afInfo
-- ArrayFire v3.6.4 (OpenCL, 64-bit Mac OSX, build 1b8030c5)
-- [0] APPLE: AMD Radeon Pro 555X Compute Engine, 4096 MB <-- brackets [] signify device being used.
-- -1- APPLE: Intel(R) UHD Graphics 630, 1536 MB
--
-- $visualization
-- The ArrayFire API is able to display visualizations using the Forge library
-- >>> window <- createWindow 800 600 "Histogram"
--