knead-0.2.3: Repa array processing using LLVM JIT

Safe HaskellNone



Generate and apply index maps. This unifies the replicate and slice functions of the accelerate package. However the structure of slicing and replicating cannot depend on parameters. If you need that, you must use backpermute and friends.



data T sh0 sh1 Source


Process (T sh0 sh1) 

type Linear sh0 sh1 = T (Shape sh0) (Shape sh1)Source

apply :: (C array, C sh0, C sh1, C a) => T sh0 sh1 -> array sh0 a -> array sh1 aSource

This is essentially a backpermute.

passAny :: Linear sh shSource

Like Any in accelerate.

pass :: Linear sh0 sh1 -> Linear (sh0 :. i) (sh1 :. i)Source

Like All in accelerate.

pick :: Exp i -> Linear sh0 sh1 -> Linear (sh0 :. i) sh1Source

Like Int in accelerate/slice.

pickFst :: Exp (Index n) -> T (n, sh) shSource

pickSnd :: Exp (Index n) -> T (sh, n) shSource

extrude :: Exp i -> Linear sh0 sh1 -> Linear sh0 (sh1 :. i)Source

Like Int in accelerate/replicate.

extrudeFst :: Exp n -> T sh (n, sh)Source

Extrusion has the potential to do duplicate work. Only use it to add dimensions of size 1, e.g. numeric 1 or unit () or to duplicate slices of physical arrays.

extrudeSnd :: Exp n -> T sh (sh, n)Source

transpose :: T (sh0, sh1) (sh1, sh0)Source

($:.) :: (Process proc0, Process proc1) => proc0 -> (proc0 -> proc1) -> proc1Source

Use this for combining several dimension manipulators. E.g.

 apply (passAny $:. pick 3 $:. pass $:. replicate 10) array

The constraint (Process proc0, Process proc1) is a bit weak. We like to enforce that the type constructor like Slice.T is the same in proc0 and proc1, and only the parameters differ. Currently this coherence is achieved, because we only provide functions of type proc0 -> proc1 with this condition.

id :: T sh shSource

first :: T sh0 sh1 -> T (sh0, sh) (sh1, sh)Source

second :: T sh0 sh1 -> T (sh, sh0) (sh, sh1)Source

compose :: T sh0 sh1 -> T sh1 sh2 -> T sh0 sh2Source