2626-- main :: 'IO' ()
2727-- main = 'print' ('matrix' \@'Double' (2,2) [ [1..], [1..] ])
2828-- @
29+ --
30+ -- @
31+ -- ArrayFire Array
32+ -- [2 2 1 1]
33+ -- 1.0000 2.0000
34+ -- 1.0000 2.0000
35+ -- @
2936--------------------------------------------------------------------------------
3037module ArrayFire.Array where
3138
@@ -93,7 +100,6 @@ matrix (x,y)
93100-- 2.0000 2.0000
94101-- 2.0000 2.0000
95102-- @
96- --
97103cube :: AFType a => (Int ,Int ,Int ) -> [[[a ]]] -> Array a
98104cube (x,y,z)
99105 = mkArray [x,y,z]
@@ -123,7 +129,6 @@ cube (x,y,z)
123129-- 2.0000 2.0000
124130-- 2.0000 2.0000
125131-- @
126- --
127132tensor :: AFType a => (Int , Int ,Int ,Int ) -> [[[[a ]]]] -> Array a
128133tensor (w,x,y,z)
129134 = mkArray [w,x,y,z]
@@ -138,11 +143,10 @@ tensor (w,x,y,z)
138143-- | Internal function for 'Array' construction
139144--
140145-- >>> mkArray @Double [10] [1.0 .. 10.0]
141- -- @
142146-- ArrayFire Array
143147-- [10 1 1 1]
144148-- 1.0000 2.0000 3.0000 4.0000 5.0000 6.0000 7.0000 8.0000 9.0000 10.0000
145- -- @
149+ --
146150mkArray
147151 :: forall array
148152 . AFType array
@@ -171,6 +175,11 @@ mkArray dims xs =
171175-- af_err af_create_handle(af_array *arr, const unsigned ndims, const dim_t * const dims, const af_dtype type);
172176
173177-- | Copies an 'Array' to a new 'Array'
178+ --
179+ -- >>> copyArray (scalar @Double 10)
180+ -- ArrayFire Array
181+ -- [1 1 1 1]
182+ -- 10.0000
174183copyArray
175184 :: AFType a
176185 => Array a
@@ -182,6 +191,11 @@ copyArray = (`op1` af_copy_array)
182191-- af_err af_get_data_ptr(void *data, const af_array arr);
183192
184193-- | Retains an 'Array', increases reference count
194+ --
195+ -- >>> retainArray (scalar @Double 10)
196+ -- ArrayFire Array
197+ -- [1 1 1 1]
198+ -- 10.0000
185199retainArray
186200 :: AFType a
187201 => Array a
@@ -191,6 +205,12 @@ retainArray =
191205 (`op1` af_retain_array)
192206
193207-- | Retrieves 'Array' reference count
208+ --
209+ -- >>> initialArray = scalar @Double 10
210+ -- >>> retainedArray = retain initialArray
211+ -- >>> getDataRefCount retainedArray
212+ -- 2
213+ --
194214getDataRefCount
195215 :: AFType a
196216 => Array a
@@ -204,6 +224,9 @@ getDataRefCount =
204224-- af_err af_eval_multiple(const int num, af_array *arrays);
205225
206226-- | Should manual evaluation occur
227+ --
228+ -- >>> setManualEvalFlag True
229+ -- ()
207230setManualEvalFlag
208231 :: Bool
209232 -- ^ Whether or not to perform manual evaluation
@@ -212,12 +235,21 @@ setManualEvalFlag (fromIntegral . fromEnum -> b) =
212235 afCall (af_set_manual_eval_flag b)
213236
214237-- | Retrieve manual evaluation status
238+ --
239+ -- >>> setManualEvalFlag False
240+ -- >>> getManualEvalFlag
241+ -- False
242+ --
215243getManualEvalFlag
216244 :: IO Bool
217245getManualEvalFlag =
218246 toEnum . fromIntegral <$> afCall1 af_get_manual_eval_flag
219247
220248-- | Retrieve element count
249+ --
250+ -- >>> getElements (vector @Double 10 [1..])
251+ -- 10
252+ --
221253getElements
222254 :: AFType a
223255 => Array a
@@ -228,13 +260,21 @@ getElements a =
228260 fromIntegral (a `infoFromArray` af_get_elements)
229261
230262-- | Retrieve type of 'Array'
263+ --
264+ -- >>> getType (vector @Double 10 [1..])
265+ -- F64
266+ --
231267getType
232268 :: AFType a
233269 => Array a
234270 -> AFDType
235271getType a = fromAFType (a `infoFromArray` af_get_type)
236272
237273-- | Retrieves dimensions of 'Array'
274+ --
275+ -- >>> getDims (vector @Double 10 [1..])
276+ -- (10,1,1,1)
277+ --
238278getDims
239279 :: AFType a
240280 => Array a
@@ -244,111 +284,174 @@ getDims arr = do
244284 (fromIntegral a, fromIntegral b, fromIntegral c, fromIntegral d)
245285
246286-- | Retrieves number of dimensions in 'Array'
287+ --
288+ -- >>> getNumDims (matrix @Double (2,2) [[1..],[1..]])
289+ -- 2
290+ --
247291getNumDims
248292 :: AFType a
249293 => Array a
250294 -> Int
251295getNumDims = fromIntegral . (`infoFromArray` af_get_numdims)
252296
253297-- | Checks if an 'Array' is empty
298+ --
299+ -- >>> isEmpty (matrix @Double (2,2) [[1..],[1..]])
300+ -- False
301+ --
254302isEmpty
255303 :: AFType a
256304 => Array a
257305 -> Bool
258306isEmpty a = toEnum . fromIntegral $ (a `infoFromArray` af_is_empty)
259307
260308-- | 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+ --
261315isScalar
262316 :: AFType a
263317 => Array a
264318 -> Bool
265319isScalar a = toEnum . fromIntegral $ (a `infoFromArray` af_is_scalar)
266320
267321-- | Checks if an 'Array' is row-oriented
322+ --
323+ -- >>> isRow (matrix @Double (2,2) [[1..],[1..]])
324+ -- False
325+ --
268326isRow
269327 :: AFType a
270328 => Array a
271329 -> Bool
272330isRow a = toEnum . fromIntegral $ (a `infoFromArray` af_is_row)
273331
274332-- | Checks if an 'Array' is a column-oriented
333+ --
334+ -- >>> isColumn (vector @Double 10 [1..])
335+ -- True
336+ --
275337isColumn
276338 :: AFType a
277339 => Array a
278340 -> Bool
279341isColumn a = toEnum . fromIntegral $ (a `infoFromArray` af_is_column)
280342
281343-- | 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+ --
282350isVector
283351 :: AFType a
284352 => Array a
285353 -> Bool
286354isVector a = toEnum . fromIntegral $ (a `infoFromArray` af_is_vector)
287355
288356-- | Checks if an 'Array' is a 'Complex'
357+ --
358+ -- >>> isComplex (scalar (1.0 :+ 1.0) :: Array (Complex Double))
359+ -- True
360+ --
289361isComplex
290362 :: AFType a
291363 => Array a
292364 -> Bool
293365isComplex a = toEnum . fromIntegral $ (a `infoFromArray` af_is_complex)
294366
295367-- | Checks if an 'Array' is 'Real'
368+ --
369+ -- >>> isReal (scalar 1.0 :: Array Double)
370+ -- True
371+ --
296372isReal
297373 :: AFType a
298374 => Array a
299375 -> Bool
300376isReal a = toEnum . fromIntegral $ (a `infoFromArray` af_is_real)
301377
302378-- | Checks if an 'Array' is 'Double'
379+ --
380+ -- >>> isDouble (scalar 1.0 :: Array Double)
381+ -- True
382+ --
303383isDouble
304384 :: AFType a
305385 => Array a
306386 -> Bool
307387isDouble a = toEnum . fromIntegral $ (a `infoFromArray` af_is_double)
308388
309389-- | Checks if an 'Array' is 'Float'
390+ --
391+ -- >>> isSingle (scalar 1.0 :: Array Float)
392+ -- True
393+ --
310394isSingle
311395 :: AFType a
312396 => Array a
313397 -> Bool
314398isSingle a = toEnum . fromIntegral $ (a `infoFromArray` af_is_single)
315399
316400-- | Checks if an 'Array' is 'Double', 'Float', 'Complex Double', or 'Complex Float'
401+ --
402+ -- >>> isRealFloating (scalar 1.0 :: Array Double)
403+ -- True
404+ --
317405isRealFloating
318406 :: AFType a
319407 => Array a
320408 -> Bool
321409isRealFloating a = toEnum . fromIntegral $ (a `infoFromArray` af_is_realfloating)
322410
323411-- | Checks if an 'Array' is 'Double' or 'Float'
412+ --
413+ -- >>> isFloating (scalar 1.0 :: Array Double)
414+ -- True
324415isFloating
325416 :: AFType a
326417 => Array a
327418 -> Bool
328419isFloating a = toEnum . fromIntegral $ (a `infoFromArray` af_is_floating)
329420
330421-- | Checks if an 'Array' is of type 'Int16', 'Int32', or 'Int64'
422+ --
423+ -- >>> isInteger (scalar 1 :: Array Int16)
424+ -- True
331425isInteger
332426 :: AFType a
333427 => Array a
334428 -> Bool
335429isInteger a = toEnum . fromIntegral $ (a `infoFromArray` af_is_integer)
336430
337431-- | Checks if an 'Array' is of type 'CBool'
432+ --
433+ -- >>> isBool (scalar 1 :: Array CBool)
434+ -- True
338435isBool
339436 :: AFType a
340437 => Array a
341438 -> Bool
342439isBool a = toEnum . fromIntegral $ (a `infoFromArray` af_is_bool)
343440
344441-- | Checks if an 'Array' is sparse
442+ --
443+ -- >>> isSparse (scalar 1 :: Array Double)
444+ -- False
345445isSparse
346446 :: AFType a
347447 => Array a
348448 -> Bool
349449isSparse a = toEnum . fromIntegral $ (a `infoFromArray` af_is_sparse)
350450
351451-- | 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]
352455toVector :: forall a . AFType a => Array a -> Vector a
353456toVector arr@ (Array fptr) = do
354457 unsafePerformIO . mask_ . withForeignPtr fptr $ \ arrPtr -> do
@@ -360,10 +463,16 @@ toVector arr@(Array fptr) = do
360463 pure $ unsafeFromForeignPtr0 newFptr len
361464
362465-- | 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]
363469toList :: forall a . AFType a => Array a -> [a ]
364470toList = V. toList . toVector
365471
366472-- | Retrieves single scalar value from an 'Array'
473+ --
474+ -- >>> getScalar (scalar @Double 22.0) :: Double
475+ -- 22.0
367476getScalar :: forall a b . (Storable a , AFType b ) => Array b -> a
368477getScalar (Array fptr) =
369478 unsafePerformIO . mask_ . withForeignPtr fptr $ \ arrPtr -> do
0 commit comments