26
26
-- main :: 'IO' ()
27
27
-- main = 'print' ('matrix' \@'Double' (2,2) [ [1..], [1..] ])
28
28
-- @
29
+ --
30
+ -- @
31
+ -- ArrayFire Array
32
+ -- [2 2 1 1]
33
+ -- 1.0000 2.0000
34
+ -- 1.0000 2.0000
35
+ -- @
29
36
--------------------------------------------------------------------------------
30
37
module ArrayFire.Array where
31
38
@@ -93,7 +100,6 @@ matrix (x,y)
93
100
-- 2.0000 2.0000
94
101
-- 2.0000 2.0000
95
102
-- @
96
- --
97
103
cube :: AFType a => (Int ,Int ,Int ) -> [[[a ]]] -> Array a
98
104
cube (x,y,z)
99
105
= mkArray [x,y,z]
@@ -123,7 +129,6 @@ cube (x,y,z)
123
129
-- 2.0000 2.0000
124
130
-- 2.0000 2.0000
125
131
-- @
126
- --
127
132
tensor :: AFType a => (Int , Int ,Int ,Int ) -> [[[[a ]]]] -> Array a
128
133
tensor (w,x,y,z)
129
134
= mkArray [w,x,y,z]
@@ -138,11 +143,10 @@ tensor (w,x,y,z)
138
143
-- | Internal function for 'Array' construction
139
144
--
140
145
-- >>> mkArray @Double [10] [1.0 .. 10.0]
141
- -- @
142
146
-- ArrayFire Array
143
147
-- [10 1 1 1]
144
148
-- 1.0000 2.0000 3.0000 4.0000 5.0000 6.0000 7.0000 8.0000 9.0000 10.0000
145
- -- @
149
+ --
146
150
mkArray
147
151
:: forall array
148
152
. AFType array
@@ -171,6 +175,11 @@ mkArray dims xs =
171
175
-- af_err af_create_handle(af_array *arr, const unsigned ndims, const dim_t * const dims, const af_dtype type);
172
176
173
177
-- | Copies an 'Array' to a new 'Array'
178
+ --
179
+ -- >>> copyArray (scalar @Double 10)
180
+ -- ArrayFire Array
181
+ -- [1 1 1 1]
182
+ -- 10.0000
174
183
copyArray
175
184
:: AFType a
176
185
=> Array a
@@ -182,6 +191,11 @@ copyArray = (`op1` af_copy_array)
182
191
-- af_err af_get_data_ptr(void *data, const af_array arr);
183
192
184
193
-- | Retains an 'Array', increases reference count
194
+ --
195
+ -- >>> retainArray (scalar @Double 10)
196
+ -- ArrayFire Array
197
+ -- [1 1 1 1]
198
+ -- 10.0000
185
199
retainArray
186
200
:: AFType a
187
201
=> Array a
@@ -191,6 +205,12 @@ retainArray =
191
205
(`op1` af_retain_array)
192
206
193
207
-- | Retrieves 'Array' reference count
208
+ --
209
+ -- >>> initialArray = scalar @Double 10
210
+ -- >>> retainedArray = retain initialArray
211
+ -- >>> getDataRefCount retainedArray
212
+ -- 2
213
+ --
194
214
getDataRefCount
195
215
:: AFType a
196
216
=> Array a
@@ -204,6 +224,9 @@ getDataRefCount =
204
224
-- af_err af_eval_multiple(const int num, af_array *arrays);
205
225
206
226
-- | Should manual evaluation occur
227
+ --
228
+ -- >>> setManualEvalFlag True
229
+ -- ()
207
230
setManualEvalFlag
208
231
:: Bool
209
232
-- ^ Whether or not to perform manual evaluation
@@ -212,12 +235,21 @@ setManualEvalFlag (fromIntegral . fromEnum -> b) =
212
235
afCall (af_set_manual_eval_flag b)
213
236
214
237
-- | Retrieve manual evaluation status
238
+ --
239
+ -- >>> setManualEvalFlag False
240
+ -- >>> getManualEvalFlag
241
+ -- False
242
+ --
215
243
getManualEvalFlag
216
244
:: IO Bool
217
245
getManualEvalFlag =
218
246
toEnum . fromIntegral <$> afCall1 af_get_manual_eval_flag
219
247
220
248
-- | Retrieve element count
249
+ --
250
+ -- >>> getElements (vector @Double 10 [1..])
251
+ -- 10
252
+ --
221
253
getElements
222
254
:: AFType a
223
255
=> Array a
@@ -228,13 +260,21 @@ getElements a =
228
260
fromIntegral (a `infoFromArray` af_get_elements)
229
261
230
262
-- | Retrieve type of 'Array'
263
+ --
264
+ -- >>> getType (vector @Double 10 [1..])
265
+ -- F64
266
+ --
231
267
getType
232
268
:: AFType a
233
269
=> Array a
234
270
-> AFDType
235
271
getType a = fromAFType (a `infoFromArray` af_get_type)
236
272
237
273
-- | Retrieves dimensions of 'Array'
274
+ --
275
+ -- >>> getDims (vector @Double 10 [1..])
276
+ -- (10,1,1,1)
277
+ --
238
278
getDims
239
279
:: AFType a
240
280
=> Array a
@@ -244,111 +284,174 @@ getDims arr = do
244
284
(fromIntegral a, fromIntegral b, fromIntegral c, fromIntegral d)
245
285
246
286
-- | Retrieves number of dimensions in 'Array'
287
+ --
288
+ -- >>> getNumDims (matrix @Double (2,2) [[1..],[1..]])
289
+ -- 2
290
+ --
247
291
getNumDims
248
292
:: AFType a
249
293
=> Array a
250
294
-> Int
251
295
getNumDims = fromIntegral . (`infoFromArray` af_get_numdims)
252
296
253
297
-- | Checks if an 'Array' is empty
298
+ --
299
+ -- >>> isEmpty (matrix @Double (2,2) [[1..],[1..]])
300
+ -- False
301
+ --
254
302
isEmpty
255
303
:: AFType a
256
304
=> Array a
257
305
-> Bool
258
306
isEmpty a = toEnum . fromIntegral $ (a `infoFromArray` af_is_empty)
259
307
260
308
-- | Checks if an 'Array' is a scalar (contains only one element)
309
+ --
310
+ -- >>> isScalar (matrix @Double (2,2) [[1..],[1..]])
311
+ -- False
312
+ -- >>> isScalar (1.0 :: Array Double)
313
+ -- True
314
+ --
261
315
isScalar
262
316
:: AFType a
263
317
=> Array a
264
318
-> Bool
265
319
isScalar a = toEnum . fromIntegral $ (a `infoFromArray` af_is_scalar)
266
320
267
321
-- | Checks if an 'Array' is row-oriented
322
+ --
323
+ -- >>> isRow (matrix @Double (2,2) [[1..],[1..]])
324
+ -- False
325
+ --
268
326
isRow
269
327
:: AFType a
270
328
=> Array a
271
329
-> Bool
272
330
isRow a = toEnum . fromIntegral $ (a `infoFromArray` af_is_row)
273
331
274
332
-- | Checks if an 'Array' is a column-oriented
333
+ --
334
+ -- >>> isColumn (vector @Double 10 [1..])
335
+ -- True
336
+ --
275
337
isColumn
276
338
:: AFType a
277
339
=> Array a
278
340
-> Bool
279
341
isColumn a = toEnum . fromIntegral $ (a `infoFromArray` af_is_column)
280
342
281
343
-- | Checks if an 'Array' is a vector
344
+ --
345
+ -- >>> isVector (vector @Double 10 [1..])
346
+ -- True
347
+ -- >>> isVector (1.0 :: Array Double)
348
+ -- False
349
+ --
282
350
isVector
283
351
:: AFType a
284
352
=> Array a
285
353
-> Bool
286
354
isVector a = toEnum . fromIntegral $ (a `infoFromArray` af_is_vector)
287
355
288
356
-- | Checks if an 'Array' is a 'Complex'
357
+ --
358
+ -- >>> isComplex (scalar (1.0 :+ 1.0) :: Array (Complex Double))
359
+ -- True
360
+ --
289
361
isComplex
290
362
:: AFType a
291
363
=> Array a
292
364
-> Bool
293
365
isComplex a = toEnum . fromIntegral $ (a `infoFromArray` af_is_complex)
294
366
295
367
-- | Checks if an 'Array' is 'Real'
368
+ --
369
+ -- >>> isReal (scalar 1.0 :: Array Double)
370
+ -- True
371
+ --
296
372
isReal
297
373
:: AFType a
298
374
=> Array a
299
375
-> Bool
300
376
isReal a = toEnum . fromIntegral $ (a `infoFromArray` af_is_real)
301
377
302
378
-- | Checks if an 'Array' is 'Double'
379
+ --
380
+ -- >>> isDouble (scalar 1.0 :: Array Double)
381
+ -- True
382
+ --
303
383
isDouble
304
384
:: AFType a
305
385
=> Array a
306
386
-> Bool
307
387
isDouble a = toEnum . fromIntegral $ (a `infoFromArray` af_is_double)
308
388
309
389
-- | Checks if an 'Array' is 'Float'
390
+ --
391
+ -- >>> isSingle (scalar 1.0 :: Array Float)
392
+ -- True
393
+ --
310
394
isSingle
311
395
:: AFType a
312
396
=> Array a
313
397
-> Bool
314
398
isSingle a = toEnum . fromIntegral $ (a `infoFromArray` af_is_single)
315
399
316
400
-- | Checks if an 'Array' is 'Double', 'Float', 'Complex Double', or 'Complex Float'
401
+ --
402
+ -- >>> isRealFloating (scalar 1.0 :: Array Double)
403
+ -- True
404
+ --
317
405
isRealFloating
318
406
:: AFType a
319
407
=> Array a
320
408
-> Bool
321
409
isRealFloating a = toEnum . fromIntegral $ (a `infoFromArray` af_is_realfloating)
322
410
323
411
-- | Checks if an 'Array' is 'Double' or 'Float'
412
+ --
413
+ -- >>> isFloating (scalar 1.0 :: Array Double)
414
+ -- True
324
415
isFloating
325
416
:: AFType a
326
417
=> Array a
327
418
-> Bool
328
419
isFloating a = toEnum . fromIntegral $ (a `infoFromArray` af_is_floating)
329
420
330
421
-- | Checks if an 'Array' is of type 'Int16', 'Int32', or 'Int64'
422
+ --
423
+ -- >>> isInteger (scalar 1 :: Array Int16)
424
+ -- True
331
425
isInteger
332
426
:: AFType a
333
427
=> Array a
334
428
-> Bool
335
429
isInteger a = toEnum . fromIntegral $ (a `infoFromArray` af_is_integer)
336
430
337
431
-- | Checks if an 'Array' is of type 'CBool'
432
+ --
433
+ -- >>> isBool (scalar 1 :: Array CBool)
434
+ -- True
338
435
isBool
339
436
:: AFType a
340
437
=> Array a
341
438
-> Bool
342
439
isBool a = toEnum . fromIntegral $ (a `infoFromArray` af_is_bool)
343
440
344
441
-- | Checks if an 'Array' is sparse
442
+ --
443
+ -- >>> isSparse (scalar 1 :: Array Double)
444
+ -- False
345
445
isSparse
346
446
:: AFType a
347
447
=> Array a
348
448
-> Bool
349
449
isSparse a = toEnum . fromIntegral $ (a `infoFromArray` af_is_sparse)
350
450
351
451
-- | Converts an 'Array' to a 'Storable' 'Vector'
452
+ --
453
+ -- >>> toVector (vector @Double 10 [1..])
454
+ -- [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0]
352
455
toVector :: forall a . AFType a => Array a -> Vector a
353
456
toVector arr@ (Array fptr) = do
354
457
unsafePerformIO . mask_ . withForeignPtr fptr $ \ arrPtr -> do
@@ -360,10 +463,16 @@ toVector arr@(Array fptr) = do
360
463
pure $ unsafeFromForeignPtr0 newFptr len
361
464
362
465
-- | Converts an 'Array' to [a]
466
+ --
467
+ -- >>> toList (vector @Double 10 [1..])
468
+ -- [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0]
363
469
toList :: forall a . AFType a => Array a -> [a ]
364
470
toList = V. toList . toVector
365
471
366
472
-- | Retrieves single scalar value from an 'Array'
473
+ --
474
+ -- >>> getScalar (scalar @Double 22.0) :: Double
475
+ -- 22.0
367
476
getScalar :: forall a b . (Storable a , AFType b ) => Array b -> a
368
477
getScalar (Array fptr) =
369
478
unsafePerformIO . mask_ . withForeignPtr fptr $ \ arrPtr -> do
0 commit comments