@@ -178,6 +178,7 @@ constant dims val =
178
178
n = fromIntegral (length dims')
179
179
180
180
-- | Creates a range of values in an Array
181
+ --
181
182
-- >>> range @Double [10] (-1)
182
183
-- ArrayFire Array
183
184
-- [10 1 1 1]
@@ -187,8 +188,8 @@ range
187
188
. AFType a
188
189
=> [Int ]
189
190
-> Int
190
- -> IO ( Array a )
191
- range dims (fromIntegral -> k) = do
191
+ -> Array a
192
+ range dims (fromIntegral -> k) = unsafePerformIO $ do
192
193
ptr <- alloca $ \ ptrPtr -> mask_ $ do
193
194
withArray (fromIntegral <$> dims) $ \ dimArray -> do
194
195
throwAFError =<< af_range ptrPtr n dimArray k typ
@@ -201,28 +202,53 @@ range dims (fromIntegral -> k) = do
201
202
n = fromIntegral (length dims)
202
203
typ = afType (Proxy @ a)
203
204
205
+ -- | Create an sequence [0, dims.elements() - 1] and modify to specified dimensions dims and then tile it according to tile_dims.
206
+ --
207
+ -- <http://arrayfire.org/docs/group__data__func__iota.htm>
208
+ --
209
+ -- >>> iota @Double [5,3] []
210
+ -- ArrayFire Array
211
+ -- [5 3 1 1]
212
+ -- 0.0000 1.0000 2.0000 3.0000 4.0000
213
+ -- 5.0000 6.0000 7.0000 8.0000 9.0000
214
+ -- 10.0000 11.0000 12.0000 13.0000 14.0000
215
+ --
216
+ -- >>> iota @Double [5,3] [1,2]
217
+ -- ArrayFire Array
218
+ -- [5 6 1 1]
219
+ -- 0.0000 1.0000 2.0000 3.0000 4.0000
220
+ -- 5.0000 6.0000 7.0000 8.0000 9.0000
221
+ -- 10.0000 11.0000 12.0000 13.0000 14.0000
222
+ -- 0.0000 1.0000 2.0000 3.0000 4.0000
223
+ -- 5.0000 6.0000 7.0000 8.0000 9.0000
224
+ -- 10.0000 11.0000 12.0000 13.0000 14.0000
204
225
iota
205
226
:: forall a . AFType a
206
- => [Int ] -> [Int ] -> IO (Array a )
207
- iota dims tdims = do
227
+ => [Int ]
228
+ -- ^ is the array containing sizes of the dimension
229
+ -> [Int ]
230
+ -- ^ is array containing the number of repetitions of the unit dimensions
231
+ -> Array a
232
+ -- ^ is the generated array
233
+ iota dims tdims = unsafePerformIO $ do
234
+ let dims' = take 4 (dims ++ repeat 1 )
235
+ tdims' = take 4 (tdims ++ repeat 1 )
208
236
ptr <- alloca $ \ ptrPtr -> mask_ $ do
209
237
zeroOutArray ptrPtr
210
- withArray (fromIntegral <$> dims) $ \ dimArray ->
211
- withArray (fromIntegral <$> tdims) $ \ tdimArray -> do
212
- throwAFError =<< af_iota ptrPtr n dimArray tn tdimArray typ
238
+ withArray (fromIntegral <$> dims' ) $ \ dimArray ->
239
+ withArray (fromIntegral <$> tdims' ) $ \ tdimArray -> do
240
+ throwAFError =<< af_iota ptrPtr 4 dimArray 4 tdimArray typ
213
241
peek ptrPtr
214
242
Array <$>
215
243
newForeignPtr
216
244
af_release_array_finalizer
217
245
ptr
218
246
where
219
- n = fromIntegral (length dims)
220
- tn = fromIntegral (length tdims)
221
247
typ = afType (Proxy @ a)
222
248
223
249
-- | Creates the identity `Array` from given dimensions
224
250
--
225
- -- >>> identity [2,2] 2.0
251
+ -- >>> identity [2,2]
226
252
-- ArrayFire Array
227
253
-- [2 2 1 1]
228
254
-- 1.0000 0.0000
@@ -233,9 +259,10 @@ identity
233
259
-- ^ Dimensions
234
260
-> Array a
235
261
identity dims = unsafePerformIO . mask_ $ do
262
+ let dims' = take 4 (dims ++ repeat 1 )
236
263
ptr <- alloca $ \ ptrPtr -> mask_ $ do
237
264
zeroOutArray ptrPtr
238
- withArray (fromIntegral <$> dims) $ \ dimArray -> do
265
+ withArray (fromIntegral <$> dims' ) $ \ dimArray -> do
239
266
throwAFError =<< af_identity ptrPtr n dimArray typ
240
267
peek ptrPtr
241
268
Array <$>
@@ -246,14 +273,29 @@ identity dims = unsafePerformIO . mask_ $ do
246
273
n = fromIntegral (length dims)
247
274
typ = afType (Proxy @ a)
248
275
276
+ -- | Create a diagonal matrix from input array when extract is set to false
277
+ --
278
+ -- >>> diagCreate (vector @Double 2 [1..]) 0
279
+ -- ArrayFire Array
280
+ -- [2 2 1 1]
281
+ -- 1.0000 0.0000
282
+ -- 0.0000 2.0000
249
283
diagCreate
250
284
:: AFType (a :: * )
251
285
=> Array a
286
+ -- ^ is the input array which is the diagonal
252
287
-> Int
288
+ -- ^ is the diagonal index
253
289
-> Array a
254
290
diagCreate x (fromIntegral -> n) =
255
291
x `op1` (\ p a -> af_diag_create p a n)
256
292
293
+ -- | Create a diagonal matrix from input array when extract is set to false
294
+ --
295
+ -- >>> diagExtract (matrix @Double (2,2) [[1,2],[3,4]]) 0
296
+ -- ArrayFire Array
297
+ -- [2 1 1 1]
298
+ -- 1.0000 4.0000
257
299
diagExtract
258
300
:: AFType (a :: * )
259
301
=> Array a
@@ -262,13 +304,29 @@ diagExtract
262
304
diagExtract x (fromIntegral -> n) =
263
305
x `op1` (\ p a -> af_diag_extract p a n)
264
306
307
+ -- | Join two Arrays together along a specified dimension
308
+ --
309
+ -- >>> join 0 (matrix @Double (2,2) [[1,2],[3,4]]) (matrix @Double (2,2) [[5,6],[7,8]])
310
+ -- ArrayFire Array
311
+ -- [4 2 1 1]
312
+ -- 1.0000 2.0000 5.0000 6.0000
313
+ -- 3.0000 4.0000 7.0000 8.0000
314
+ --
265
315
join
266
316
:: Int
267
317
-> Array (a :: * )
268
318
-> Array a
269
319
-> Array a
270
320
join (fromIntegral -> n) arr1 arr2 = op2 arr1 arr2 (\ p a b -> af_join p n a b)
271
321
322
+ -- | Join many Arrays together along a specified dimension
323
+ --
324
+ -- *FIX ME*
325
+ -- >>> joinMany 0 [1,2,3]
326
+ -- ArrayFire Array
327
+ -- [3 1 1 1]
328
+ -- 1.0000 2.0000 3.0000
329
+ --
272
330
joinMany
273
331
:: Int
274
332
-> [Array a ]
@@ -288,26 +346,48 @@ joinMany (fromIntegral -> n) arrays = unsafePerformIO . mask_ $ do
288
346
where
289
347
nArrays = fromIntegral (length arrays)
290
348
349
+ -- | Tiles an Array according to specified dimensions
350
+ --
351
+ -- >>> tile @Double (scalar 22.0) [5,5]
352
+ -- ArrayFire Array
353
+ -- [5 5 1 1]
354
+ -- 22.0000 22.0000 22.0000 22.0000 22.0000
355
+ -- 22.0000 22.0000 22.0000 22.0000 22.0000
356
+ -- 22.0000 22.0000 22.0000 22.0000 22.0000
357
+ -- 22.0000 22.0000 22.0000 22.0000 22.0000
358
+ -- 22.0000 22.0000 22.0000 22.0000 22.0000
291
359
tile
292
360
:: Array (a :: * )
293
- -> Int
294
- -> Int
295
- -> Int
296
- -> Int
361
+ -> [Int ]
297
362
-> Array a
298
- tile a (fromIntegral -> x) (fromIntegral -> y) (fromIntegral -> z) (fromIntegral -> w) =
299
- a `op1` (\ p k -> af_tile p k x y z w)
363
+ tile a (take 4 . (++ repeat 1 ) -> [x,y,z,w]) =
364
+ a `op1` (\ p k -> af_tile p k (fromIntegral x) (fromIntegral y) (fromIntegral z) (fromIntegral w))
365
+ tile _ _ = error " impossible"
300
366
367
+ -- | Reorders an Array according to newly specified dimensions
368
+ --
369
+ -- *FIX ME*
370
+ -- >>> reorder @Double (scalar 22.0) [5,5]
371
+ -- ArrayFire Array
372
+ -- [5 5 1 1]
373
+ -- 22.0000 22.0000 22.0000 22.0000 22.0000
374
+ -- 22.0000 22.0000 22.0000 22.0000 22.0000
375
+ -- 22.0000 22.0000 22.0000 22.0000 22.0000
376
+ -- 22.0000 22.0000 22.0000 22.0000 22.0000
377
+ -- 22.0000 22.0000 22.0000 22.0000 22.0000
301
378
reorder
302
379
:: Array (a :: * )
303
- -> Int
304
- -> Int
305
- -> Int
306
- -> Int
380
+ -> [Int ]
307
381
-> Array a
308
- reorder a (fromIntegral -> x) (fromIntegral -> y) (fromIntegral -> z) (fromIntegral -> w) =
309
- a `op1` (\ p k -> af_tile p k x y z w)
382
+ reorder a (take 4 . (++ repeat 0 ) -> [x,y,z,w]) =
383
+ a `op1` (\ p k -> af_reorder p k (fromIntegral x) (fromIntegral y) (fromIntegral z) (fromIntegral w))
384
+ reorder _ _ = error " impossible"
310
385
386
+ -- | Shift elements in an Array along a specified dimension (elements will wrap).
387
+ -- >>> shift (vector @Double 4 [1..]) 2 0 0 0
388
+ -- ArrayFire Array
389
+ -- [4 1 1 1]
390
+ -- 3.0000 4.0000 1.0000 2.0000
311
391
shift
312
392
:: Array (a :: * )
313
393
-> Int
@@ -318,12 +398,20 @@ shift
318
398
shift a (fromIntegral -> x) (fromIntegral -> y) (fromIntegral -> z) (fromIntegral -> w) =
319
399
a `op1` (\ p k -> af_shift p k x y z w)
320
400
401
+ -- | Modify dimensions of array
402
+ --
403
+ -- >>> moddims (vector @Double 3 [1..]) [1,3]
404
+ -- ArrayFire Array
405
+ -- [1 3 1 1]
406
+ -- 1.0000
407
+ -- 2.0000
408
+ -- 3.0000
321
409
moddims
322
410
:: forall a
323
- . [ Int ]
324
- -> Array ( a :: * )
411
+ . Array ( a :: * )
412
+ -> [ Int ]
325
413
-> Array a
326
- moddims dims (Array fptr) =
414
+ moddims (Array fptr) dims =
327
415
unsafePerformIO . mask_ . withForeignPtr fptr $ \ ptr -> do
328
416
newPtr <- alloca $ \ aPtr -> do
329
417
zeroOutArray aPtr
@@ -334,11 +422,30 @@ moddims dims (Array fptr) =
334
422
where
335
423
n = fromIntegral (length dims)
336
424
425
+ -- | Flatten an Array into a single dimension
426
+ --
427
+ -- >>> flat (matrix @Double (2,2) [[1..],[1..]])
428
+ -- ArrayFire Array
429
+ -- [4 1 1 1]
430
+ -- 1.0000 2.0000 1.0000 2.0000
337
431
flat
338
432
:: Array a
339
433
-> Array a
340
434
flat = (`op1` af_flat)
341
435
436
+ -- | Flip the values of an Array along a specified dimension
437
+ --
438
+ -- >>> matrix @Double (2,2) [[2,2],[3,3]]
439
+ -- ArrayFire Array
440
+ -- [2 2 1 1]
441
+ -- 2.0000 2.0000
442
+ -- 3.0000 3.0000
443
+ --
444
+ -- >>> A.flip (matrix @Double (2,2) [[2,2],[3,3]]) 1
445
+ -- ArrayFire Array
446
+ -- [2 2 1 1]
447
+ -- 3.0000 3.0000
448
+ -- 2.0000 2.0000
342
449
flip
343
450
:: Array a
344
451
-> Int
0 commit comments