{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE UndecidableInstances #-}
module Data.Array.Internal.DynamicG(
Array(..), Vector, VecElem,
size, shapeL, rank,
toList, fromList, toVector, fromVector,
normalize,
scalar, unScalar, constant,
reshape, stretch, stretchOuter, transpose,
index, pad,
mapA, zipWithA, zipWith3A, zipWith4A, zipWith5A,
append, concatOuter,
ravel, unravel,
window, stride, rotate,
slice, rerank, rerank2, rev,
reduce, foldrA, traverseA,
allSameA,
sumA, productA, maximumA, minimumA,
anyA, allA,
broadcast,
update,
generate, iterateN, iota,
) where
import Control.DeepSeq
import Control.Monad(replicateM)
import Data.Data(Data)
import Data.List(sort)
import GHC.Generics(Generic)
import GHC.Stack
import Test.QuickCheck hiding (generate)
import Text.PrettyPrint.HughesPJClass hiding ((<>))
import Data.Array.Internal
data Array v a = A !ShapeL !(T v a)
deriving (forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall (v :: * -> *) a x. Rep (Array v a) x -> Array v a
forall (v :: * -> *) a x. Array v a -> Rep (Array v a) x
$cto :: forall (v :: * -> *) a x. Rep (Array v a) x -> Array v a
$cfrom :: forall (v :: * -> *) a x. Array v a -> Rep (Array v a) x
Generic, Array v a -> DataType
Array v a -> Constr
forall a.
Typeable a
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Array v a)
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Array v a -> c (Array v a)
forall {v :: * -> *} {a}.
(Typeable v, Typeable a, Data (v a)) =>
Typeable (Array v a)
forall (v :: * -> *) a.
(Typeable v, Typeable a, Data (v a)) =>
Array v a -> DataType
forall (v :: * -> *) a.
(Typeable v, Typeable a, Data (v a)) =>
Array v a -> Constr
forall (v :: * -> *) a.
(Typeable v, Typeable a, Data (v a)) =>
(forall b. Data b => b -> b) -> Array v a -> Array v a
forall (v :: * -> *) a u.
(Typeable v, Typeable a, Data (v a)) =>
Int -> (forall d. Data d => d -> u) -> Array v a -> u
forall (v :: * -> *) a u.
(Typeable v, Typeable a, Data (v a)) =>
(forall d. Data d => d -> u) -> Array v a -> [u]
forall (v :: * -> *) a r r'.
(Typeable v, Typeable a, Data (v a)) =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Array v a -> r
forall (v :: * -> *) a r r'.
(Typeable v, Typeable a, Data (v a)) =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Array v a -> r
forall (v :: * -> *) a (m :: * -> *).
(Typeable v, Typeable a, Data (v a), Monad m) =>
(forall d. Data d => d -> m d) -> Array v a -> m (Array v a)
forall (v :: * -> *) a (m :: * -> *).
(Typeable v, Typeable a, Data (v a), MonadPlus m) =>
(forall d. Data d => d -> m d) -> Array v a -> m (Array v a)
forall (v :: * -> *) a (c :: * -> *).
(Typeable v, Typeable a, Data (v a)) =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Array v a)
forall (v :: * -> *) a (c :: * -> *).
(Typeable v, Typeable a, Data (v a)) =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Array v a -> c (Array v a)
forall (v :: * -> *) a (t :: * -> *) (c :: * -> *).
(Typeable v, Typeable a, Data (v a), Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (Array v a))
forall (v :: * -> *) a (t :: * -> * -> *) (c :: * -> *).
(Typeable v, Typeable a, Data (v a), Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (Array v a))
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Array v a -> m (Array v a)
$cgmapMo :: forall (v :: * -> *) a (m :: * -> *).
(Typeable v, Typeable a, Data (v a), MonadPlus m) =>
(forall d. Data d => d -> m d) -> Array v a -> m (Array v a)
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Array v a -> m (Array v a)
$cgmapMp :: forall (v :: * -> *) a (m :: * -> *).
(Typeable v, Typeable a, Data (v a), MonadPlus m) =>
(forall d. Data d => d -> m d) -> Array v a -> m (Array v a)
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Array v a -> m (Array v a)
$cgmapM :: forall (v :: * -> *) a (m :: * -> *).
(Typeable v, Typeable a, Data (v a), Monad m) =>
(forall d. Data d => d -> m d) -> Array v a -> m (Array v a)
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Array v a -> u
$cgmapQi :: forall (v :: * -> *) a u.
(Typeable v, Typeable a, Data (v a)) =>
Int -> (forall d. Data d => d -> u) -> Array v a -> u
gmapQ :: forall u. (forall d. Data d => d -> u) -> Array v a -> [u]
$cgmapQ :: forall (v :: * -> *) a u.
(Typeable v, Typeable a, Data (v a)) =>
(forall d. Data d => d -> u) -> Array v a -> [u]
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Array v a -> r
$cgmapQr :: forall (v :: * -> *) a r r'.
(Typeable v, Typeable a, Data (v a)) =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Array v a -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Array v a -> r
$cgmapQl :: forall (v :: * -> *) a r r'.
(Typeable v, Typeable a, Data (v a)) =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Array v a -> r
gmapT :: (forall b. Data b => b -> b) -> Array v a -> Array v a
$cgmapT :: forall (v :: * -> *) a.
(Typeable v, Typeable a, Data (v a)) =>
(forall b. Data b => b -> b) -> Array v a -> Array v a
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (Array v a))
$cdataCast2 :: forall (v :: * -> *) a (t :: * -> * -> *) (c :: * -> *).
(Typeable v, Typeable a, Data (v a), Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (Array v a))
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (Array v a))
$cdataCast1 :: forall (v :: * -> *) a (t :: * -> *) (c :: * -> *).
(Typeable v, Typeable a, Data (v a), Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (Array v a))
dataTypeOf :: Array v a -> DataType
$cdataTypeOf :: forall (v :: * -> *) a.
(Typeable v, Typeable a, Data (v a)) =>
Array v a -> DataType
toConstr :: Array v a -> Constr
$ctoConstr :: forall (v :: * -> *) a.
(Typeable v, Typeable a, Data (v a)) =>
Array v a -> Constr
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Array v a)
$cgunfold :: forall (v :: * -> *) a (c :: * -> *).
(Typeable v, Typeable a, Data (v a)) =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Array v a)
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Array v a -> c (Array v a)
$cgfoldl :: forall (v :: * -> *) a (c :: * -> *).
(Typeable v, Typeable a, Data (v a)) =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Array v a -> c (Array v a)
Data)
instance (Vector v, Show a, VecElem v a) => Show (Array v a) where
showsPrec :: Int -> Array v a -> ShowS
showsPrec Int
p a :: Array v a
a@(A ShapeL
s T v a
_) = Bool -> ShowS -> ShowS
showParen (Int
p forall a. Ord a => a -> a -> Bool
> Int
10) forall a b. (a -> b) -> a -> b
$
String -> ShowS
showString String
"fromList " forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 ShapeL
s forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
" " forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 (forall (v :: * -> *) a. (Vector v, VecElem v a) => Array v a -> [a]
toList Array v a
a)
instance (Vector v, Read a, VecElem v a) => Read (Array v a) where
readsPrec :: Int -> ReadS (Array v a)
readsPrec Int
p = forall a. Bool -> ReadS a -> ReadS a
readParen (Int
p forall a. Ord a => a -> a -> Bool
> Int
10) forall a b. (a -> b) -> a -> b
$ \ String
r1 ->
[(forall (v :: * -> *) a.
(HasCallStack, Vector v, VecElem v a) =>
ShapeL -> [a] -> Array v a
fromList ShapeL
s [a]
xs, String
r4) | (String
"fromList", String
r2) <- ReadS String
lex String
r1, (ShapeL
s, String
r3) <- forall a. Read a => Int -> ReadS a
readsPrec Int
11 String
r2,
([a]
xs, String
r4) <- forall a. Read a => Int -> ReadS a
readsPrec Int
11 String
r3, forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
product ShapeL
s forall a. Eq a => a -> a -> Bool
== forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
xs]
instance (Vector v, Eq a, VecElem v a, Eq (v a)) => Eq (Array v a) where
(A ShapeL
s T v a
v) == :: Array v a -> Array v a -> Bool
== (A ShapeL
s' T v a
v') = ShapeL
s forall a. Eq a => a -> a -> Bool
== ShapeL
s' Bool -> Bool -> Bool
&& forall (v :: * -> *) a.
(Vector v, VecElem v a, Eq a, Eq (v a)) =>
ShapeL -> T v a -> T v a -> Bool
equalT ShapeL
s T v a
v T v a
v'
{-# INLINE (==) #-}
instance (Vector v, Ord a, Ord (v a), VecElem v a) => Ord (Array v a) where
(A ShapeL
s T v a
v) compare :: Array v a -> Array v a -> Ordering
`compare` (A ShapeL
s' T v a
v') = forall a. Ord a => a -> a -> Ordering
compare ShapeL
s ShapeL
s' forall a. Semigroup a => a -> a -> a
<> forall (v :: * -> *) a.
(Vector v, VecElem v a, Ord a, Ord (v a)) =>
ShapeL -> T v a -> T v a -> Ordering
compareT ShapeL
s T v a
v T v a
v'
{-# INLINE compare #-}
instance (Vector v, Pretty a, VecElem v a) => Pretty (Array v a) where
pPrintPrec :: PrettyLevel -> Rational -> Array v a -> Doc
pPrintPrec PrettyLevel
l Rational
p (A ShapeL
sh T v a
t) = forall (v :: * -> *) a.
(Vector v, VecElem v a, Pretty a) =>
PrettyLevel -> Rational -> ShapeL -> T v a -> Doc
ppT PrettyLevel
l Rational
p ShapeL
sh T v a
t
instance (NFData (v a)) => NFData (Array v a)
{-# INLINE size #-}
size :: Array v a -> Int
size :: forall (v :: * -> *) a. Array v a -> Int
size = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
product forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (v :: * -> *) a. Array v a -> ShapeL
shapeL
{-# INLINE shapeL #-}
shapeL :: Array v a -> ShapeL
shapeL :: forall (v :: * -> *) a. Array v a -> ShapeL
shapeL (A ShapeL
s T v a
_) = ShapeL
s
{-# INLINE rank #-}
rank :: Array v a -> Int
rank :: forall (v :: * -> *) a. Array v a -> Int
rank (A ShapeL
s T v a
_) = forall (t :: * -> *) a. Foldable t => t a -> Int
length ShapeL
s
{-# INLINE index #-}
index :: (HasCallStack, Vector v) => Array v a -> Int -> Array v a
index :: forall (v :: * -> *) a.
(HasCallStack, Vector v) =>
Array v a -> Int -> Array v a
index (A (Int
s:ShapeL
ss) T v a
t) Int
i | Int
i forall a. Ord a => a -> a -> Bool
< Int
0 Bool -> Bool -> Bool
|| Int
i forall a. Ord a => a -> a -> Bool
>= Int
s = forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ String
"index: out of bounds " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (Int
i, Int
s)
| Bool
otherwise = forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A ShapeL
ss forall a b. (a -> b) -> a -> b
$ forall (v :: * -> *) a. T v a -> Int -> T v a
indexT T v a
t Int
i
index (A [] T v a
_) Int
_ = forall a. HasCallStack => String -> a
error String
"index: scalar"
{-# INLINE toList #-}
toList :: (Vector v, VecElem v a) => Array v a -> [a]
toList :: forall (v :: * -> *) a. (Vector v, VecElem v a) => Array v a -> [a]
toList (A ShapeL
sh T v a
t) = forall (v :: * -> *) a.
(Vector v, VecElem v a) =>
ShapeL -> T v a -> [a]
toListT ShapeL
sh T v a
t
{-# INLINE toVector #-}
toVector :: (Vector v, VecElem v a) => Array v a -> v a
toVector :: forall (v :: * -> *) a. (Vector v, VecElem v a) => Array v a -> v a
toVector (A ShapeL
sh T v a
t) = forall (v :: * -> *) a.
(Vector v, VecElem v a) =>
ShapeL -> T v a -> v a
toVectorT ShapeL
sh T v a
t
{-# INLINE fromList #-}
fromList :: (HasCallStack, Vector v, VecElem v a) => ShapeL -> [a] -> Array v a
fromList :: forall (v :: * -> *) a.
(HasCallStack, Vector v, VecElem v a) =>
ShapeL -> [a] -> Array v a
fromList ShapeL
ss [a]
vs | Int
n forall a. Eq a => a -> a -> Bool
/= Int
l = forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ String
"fromList: size mismatch" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (Int
n, Int
l)
| Bool
otherwise = forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A ShapeL
ss forall a b. (a -> b) -> a -> b
$ forall (v :: * -> *) a. ShapeL -> Int -> v a -> T v a
T ShapeL
st Int
0 forall a b. (a -> b) -> a -> b
$ forall (v :: * -> *) a. (Vector v, VecElem v a) => [a] -> v a
vFromList [a]
vs
where Int
n : ShapeL
st = ShapeL -> ShapeL
getStridesT ShapeL
ss
l :: Int
l = forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
vs
{-# INLINE fromVector #-}
fromVector :: (HasCallStack, Vector v, VecElem v a) => ShapeL -> v a -> Array v a
fromVector :: forall (v :: * -> *) a.
(HasCallStack, Vector v, VecElem v a) =>
ShapeL -> v a -> Array v a
fromVector ShapeL
ss v a
v | Int
n forall a. Eq a => a -> a -> Bool
/= Int
l = forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ String
"fromList: size mismatch" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (Int
n, Int
l)
| Bool
otherwise = forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A ShapeL
ss forall a b. (a -> b) -> a -> b
$ forall (v :: * -> *) a. ShapeL -> Int -> v a -> T v a
T ShapeL
st Int
0 v a
v
where Int
n : ShapeL
st = ShapeL -> ShapeL
getStridesT ShapeL
ss
l :: Int
l = forall (v :: * -> *) a. (Vector v, VecElem v a) => v a -> Int
vLength v a
v
{-# INLINE normalize #-}
normalize :: (Vector v, VecElem v a) => Array v a -> Array v a
normalize :: forall (v :: * -> *) a.
(Vector v, VecElem v a) =>
Array v a -> Array v a
normalize Array v a
a = forall (v :: * -> *) a.
(HasCallStack, Vector v, VecElem v a) =>
ShapeL -> v a -> Array v a
fromVector (forall (v :: * -> *) a. Array v a -> ShapeL
shapeL Array v a
a) forall a b. (a -> b) -> a -> b
$ forall (v :: * -> *) a. (Vector v, VecElem v a) => Array v a -> v a
toVector Array v a
a
{-# INLINE reshape #-}
reshape :: (HasCallStack, Vector v, VecElem v a) => ShapeL -> Array v a -> Array v a
reshape :: forall (v :: * -> *) a.
(HasCallStack, Vector v, VecElem v a) =>
ShapeL -> Array v a -> Array v a
reshape ShapeL
sh (A ShapeL
sh' t :: T v a
t@(T ShapeL
ost Int
oo v a
v))
| Int
n forall a. Eq a => a -> a -> Bool
/= Int
n' = forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ String
"reshape: size mismatch " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (ShapeL
sh, ShapeL
sh')
| forall (v :: * -> *) a. (Vector v, VecElem v a) => v a -> Int
vLength v a
v forall a. Eq a => a -> a -> Bool
== Int
1 = forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A ShapeL
sh forall a b. (a -> b) -> a -> b
$ forall (v :: * -> *) a. ShapeL -> Int -> v a -> T v a
T (forall a b. (a -> b) -> [a] -> [b]
map (forall a b. a -> b -> a
const Int
0) ShapeL
sh) Int
0 v a
v
| Just ShapeL
nst <- ShapeL -> ShapeL -> ShapeL -> Maybe ShapeL
simpleReshape ShapeL
ost ShapeL
sh' ShapeL
sh = forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A ShapeL
sh forall a b. (a -> b) -> a -> b
$ forall (v :: * -> *) a. ShapeL -> Int -> v a -> T v a
T ShapeL
nst Int
oo v a
v
| Bool
otherwise = forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A ShapeL
sh forall a b. (a -> b) -> a -> b
$ forall (v :: * -> *) a. ShapeL -> Int -> v a -> T v a
T ShapeL
st Int
0 forall a b. (a -> b) -> a -> b
$ forall (v :: * -> *) a.
(Vector v, VecElem v a) =>
ShapeL -> T v a -> v a
toVectorT ShapeL
sh' T v a
t
where Int
n : ShapeL
st = ShapeL -> ShapeL
getStridesT ShapeL
sh
n' :: Int
n' = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
product ShapeL
sh'
{-# INLINE stretch #-}
stretch :: (HasCallStack) => ShapeL -> Array v a -> Array v a
stretch :: forall (v :: * -> *) a.
HasCallStack =>
ShapeL -> Array v a -> Array v a
stretch ShapeL
sh (A ShapeL
sh' T v a
vs) | Just [Bool]
bs <- forall {a}. (Eq a, Num a) => [a] -> [a] -> Maybe [Bool]
str ShapeL
sh ShapeL
sh' = forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A ShapeL
sh forall a b. (a -> b) -> a -> b
$ forall (v :: * -> *) a. [Bool] -> T v a -> T v a
stretchT [Bool]
bs T v a
vs
| Bool
otherwise = forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ String
"stretch: incompatible " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (ShapeL
sh, ShapeL
sh')
where str :: [a] -> [a] -> Maybe [Bool]
str [] [] = forall a. a -> Maybe a
Just []
str (a
x:[a]
xs) (a
y:[a]
ys) | a
x forall a. Eq a => a -> a -> Bool
== a
y = (Bool
False forall a. a -> [a] -> [a]
:) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [a] -> [a] -> Maybe [Bool]
str [a]
xs [a]
ys
| a
y forall a. Eq a => a -> a -> Bool
== a
1 = (Bool
True forall a. a -> [a] -> [a]
:) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [a] -> [a] -> Maybe [Bool]
str [a]
xs [a]
ys
str [a]
_ [a]
_ = forall a. Maybe a
Nothing
{-# INLINE stretchOuter #-}
stretchOuter :: (HasCallStack) => Int -> Array v a -> Array v a
stretchOuter :: forall (v :: * -> *) a.
HasCallStack =>
Int -> Array v a -> Array v a
stretchOuter Int
s (A (Int
1:ShapeL
sh) T v a
vs) =
forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A (Int
sforall a. a -> [a] -> [a]
:ShapeL
sh) forall a b. (a -> b) -> a -> b
$ forall (v :: * -> *) a. [Bool] -> T v a -> T v a
stretchT (Bool
True forall a. a -> [a] -> [a]
: forall a b. (a -> b) -> [a] -> [b]
map (forall a b. a -> b -> a
const Bool
False) (forall (v :: * -> *) a. T v a -> ShapeL
strides T v a
vs)) T v a
vs
stretchOuter Int
_ Array v a
_ = forall a. HasCallStack => String -> a
error String
"stretchOuter: needs outermost dimension of size 1"
{-# INLINE scalar #-}
scalar :: (Vector v, VecElem v a) => a -> Array v a
scalar :: forall (v :: * -> *) a. (Vector v, VecElem v a) => a -> Array v a
scalar = forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A [] forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (v :: * -> *) a. (Vector v, VecElem v a) => a -> T v a
scalarT
{-# INLINE unScalar #-}
unScalar :: (HasCallStack, Vector v, VecElem v a) => Array v a -> a
unScalar :: forall (v :: * -> *) a.
(HasCallStack, Vector v, VecElem v a) =>
Array v a -> a
unScalar (A [] T v a
t) = forall (v :: * -> *) a. (Vector v, VecElem v a) => T v a -> a
unScalarT T v a
t
unScalar Array v a
_ = forall a. HasCallStack => String -> a
error String
"unScalar: not a scalar"
{-# INLINE constant #-}
constant :: (HasCallStack, Vector v, VecElem v a) => ShapeL -> a -> Array v a
constant :: forall (v :: * -> *) a.
(HasCallStack, Vector v, VecElem v a) =>
ShapeL -> a -> Array v a
constant ShapeL
sh | ShapeL -> Bool
badShape ShapeL
sh = forall a. HasCallStack => String -> a
error String
"constant: bad shape"
| Bool
otherwise = forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A ShapeL
sh forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (v :: * -> *) a.
(Vector v, VecElem v a) =>
ShapeL -> a -> T v a
constantT ShapeL
sh
{-# INLINE mapA #-}
mapA :: (Vector v, VecElem v a, VecElem v b) => (a -> b) -> Array v a -> Array v b
mapA :: forall (v :: * -> *) a b.
(Vector v, VecElem v a, VecElem v b) =>
(a -> b) -> Array v a -> Array v b
mapA a -> b
f (A ShapeL
s T v a
t) = forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A ShapeL
s (forall (v :: * -> *) a b.
(Vector v, VecElem v a, VecElem v b) =>
ShapeL -> (a -> b) -> T v a -> T v b
mapT ShapeL
s a -> b
f T v a
t)
{-# INLINE zipWithA #-}
zipWithA :: (HasCallStack, Vector v, VecElem v a, VecElem v b, VecElem v c) =>
(a -> b -> c) -> Array v a -> Array v b -> Array v c
zipWithA :: forall (v :: * -> *) a b c.
(HasCallStack, Vector v, VecElem v a, VecElem v b, VecElem v c) =>
(a -> b -> c) -> Array v a -> Array v b -> Array v c
zipWithA a -> b -> c
f (A ShapeL
s T v a
t) (A ShapeL
s' T v b
t') | ShapeL
s forall a. Eq a => a -> a -> Bool
== ShapeL
s' = forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A ShapeL
s (forall (v :: * -> *) a b c.
(Vector v, VecElem v a, VecElem v b, VecElem v c) =>
ShapeL -> (a -> b -> c) -> T v a -> T v b -> T v c
zipWithT ShapeL
s a -> b -> c
f T v a
t T v b
t')
| Bool
otherwise = forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ String
"zipWithA: shape mismatch: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (ShapeL
s, ShapeL
s')
{-# INLINE zipWith3A #-}
zipWith3A :: (HasCallStack, Vector v, VecElem v a, VecElem v b, VecElem v c, VecElem v d) =>
(a -> b -> c -> d) -> Array v a -> Array v b -> Array v c -> Array v d
zipWith3A :: forall (v :: * -> *) a b c d.
(HasCallStack, Vector v, VecElem v a, VecElem v b, VecElem v c,
VecElem v d) =>
(a -> b -> c -> d)
-> Array v a -> Array v b -> Array v c -> Array v d
zipWith3A a -> b -> c -> d
f (A ShapeL
s T v a
t) (A ShapeL
s' T v b
t') (A ShapeL
s'' T v c
t'') | ShapeL
s forall a. Eq a => a -> a -> Bool
== ShapeL
s' Bool -> Bool -> Bool
&& ShapeL
s forall a. Eq a => a -> a -> Bool
== ShapeL
s'' = forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A ShapeL
s (forall (v :: * -> *) a b c d.
(Vector v, VecElem v a, VecElem v b, VecElem v c, VecElem v d) =>
ShapeL -> (a -> b -> c -> d) -> T v a -> T v b -> T v c -> T v d
zipWith3T ShapeL
s a -> b -> c -> d
f T v a
t T v b
t' T v c
t'')
| Bool
otherwise = forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ String
"zipWith3A: shape mismatch: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (ShapeL
s, ShapeL
s', ShapeL
s'')
{-# INLINE zipWith4A #-}
zipWith4A :: (HasCallStack, Vector v, VecElem v a, VecElem v b, VecElem v c, VecElem v d, VecElem v e) =>
(a -> b -> c -> d -> e) -> Array v a -> Array v b -> Array v c -> Array v d -> Array v e
zipWith4A :: forall (v :: * -> *) a b c d e.
(HasCallStack, Vector v, VecElem v a, VecElem v b, VecElem v c,
VecElem v d, VecElem v e) =>
(a -> b -> c -> d -> e)
-> Array v a -> Array v b -> Array v c -> Array v d -> Array v e
zipWith4A a -> b -> c -> d -> e
f (A ShapeL
s T v a
t) (A ShapeL
s' T v b
t') (A ShapeL
s'' T v c
t'') (A ShapeL
s''' T v d
t''') | ShapeL
s forall a. Eq a => a -> a -> Bool
== ShapeL
s' Bool -> Bool -> Bool
&& ShapeL
s forall a. Eq a => a -> a -> Bool
== ShapeL
s'' Bool -> Bool -> Bool
&& ShapeL
s forall a. Eq a => a -> a -> Bool
== ShapeL
s''' = forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A ShapeL
s (forall (v :: * -> *) a b c d e.
(Vector v, VecElem v a, VecElem v b, VecElem v c, VecElem v d,
VecElem v e) =>
ShapeL
-> (a -> b -> c -> d -> e)
-> T v a
-> T v b
-> T v c
-> T v d
-> T v e
zipWith4T ShapeL
s a -> b -> c -> d -> e
f T v a
t T v b
t' T v c
t'' T v d
t''')
| Bool
otherwise = forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ String
"zipWith4A: shape mismatch: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (ShapeL
s, ShapeL
s', ShapeL
s'', ShapeL
s''')
{-# INLINE zipWith5A #-}
zipWith5A :: (HasCallStack, Vector v, VecElem v a, VecElem v b, VecElem v c, VecElem v d, VecElem v e, VecElem v f) =>
(a -> b -> c -> d -> e -> f) -> Array v a -> Array v b -> Array v c -> Array v d -> Array v e -> Array v f
zipWith5A :: forall (v :: * -> *) a b c d e f.
(HasCallStack, Vector v, VecElem v a, VecElem v b, VecElem v c,
VecElem v d, VecElem v e, VecElem v f) =>
(a -> b -> c -> d -> e -> f)
-> Array v a
-> Array v b
-> Array v c
-> Array v d
-> Array v e
-> Array v f
zipWith5A a -> b -> c -> d -> e -> f
f (A ShapeL
s T v a
t) (A ShapeL
s' T v b
t') (A ShapeL
s'' T v c
t'') (A ShapeL
s''' T v d
t''') (A ShapeL
s'''' T v e
t'''') | ShapeL
s forall a. Eq a => a -> a -> Bool
== ShapeL
s' Bool -> Bool -> Bool
&& ShapeL
s forall a. Eq a => a -> a -> Bool
== ShapeL
s'' Bool -> Bool -> Bool
&& ShapeL
s forall a. Eq a => a -> a -> Bool
== ShapeL
s''' Bool -> Bool -> Bool
&& ShapeL
s forall a. Eq a => a -> a -> Bool
== ShapeL
s'''' = forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A ShapeL
s (forall (v :: * -> *) a b c d e f.
(Vector v, VecElem v a, VecElem v b, VecElem v c, VecElem v d,
VecElem v e, VecElem v f) =>
ShapeL
-> (a -> b -> c -> d -> e -> f)
-> T v a
-> T v b
-> T v c
-> T v d
-> T v e
-> T v f
zipWith5T ShapeL
s a -> b -> c -> d -> e -> f
f T v a
t T v b
t' T v c
t'' T v d
t''' T v e
t'''')
| Bool
otherwise = forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ String
"zipWith5A: shape mismatch: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (ShapeL
s, ShapeL
s', ShapeL
s'', ShapeL
s''', ShapeL
s'''')
{-# INLINE pad #-}
pad :: forall a v . (Vector v, VecElem v a) =>
[(Int, Int)] -> a -> Array v a -> Array v a
pad :: forall a (v :: * -> *).
(Vector v, VecElem v a) =>
[(Int, Int)] -> a -> Array v a -> Array v a
pad [(Int, Int)]
aps a
v (A ShapeL
ash T v a
at) = forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A forall a b. (a -> b) -> a -> b
$ forall (v :: * -> *) a.
(Vector v, VecElem v a) =>
a -> [(Int, Int)] -> ShapeL -> T v a -> (ShapeL, T v a)
padT a
v [(Int, Int)]
aps ShapeL
ash T v a
at
{-# INLINE transpose #-}
transpose :: (HasCallStack) => [Int] -> Array v a -> Array v a
transpose :: forall (v :: * -> *) a.
HasCallStack =>
ShapeL -> Array v a -> Array v a
transpose ShapeL
is (A ShapeL
sh T v a
t) | Int
l forall a. Ord a => a -> a -> Bool
> Int
n = forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ String
"transpose: rank exceeded " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (ShapeL
is, ShapeL
sh)
| forall a. Ord a => [a] -> [a]
sort ShapeL
is forall a. Eq a => a -> a -> Bool
/= [Int
0 .. Int
lforall a. Num a => a -> a -> a
-Int
1] =
forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ String
"transpose: not a permutation: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show ShapeL
is
| Bool
otherwise = forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A (forall a. ShapeL -> [a] -> [a]
permute ShapeL
is' ShapeL
sh) (forall (v :: * -> *) a. ShapeL -> T v a -> T v a
transposeT ShapeL
is' T v a
t)
where l :: Int
l = forall (t :: * -> *) a. Foldable t => t a -> Int
length ShapeL
is
n :: Int
n = forall (t :: * -> *) a. Foldable t => t a -> Int
length ShapeL
sh
is' :: ShapeL
is' = ShapeL
is forall a. [a] -> [a] -> [a]
++ [Int
l .. Int
nforall a. Num a => a -> a -> a
-Int
1]
{-# INLINE append #-}
append :: (HasCallStack, Vector v, VecElem v a) => Array v a -> Array v a -> Array v a
append :: forall (v :: * -> *) a.
(HasCallStack, Vector v, VecElem v a) =>
Array v a -> Array v a -> Array v a
append a :: Array v a
a@(A (Int
sa:ShapeL
sh) T v a
_) b :: Array v a
b@(A (Int
sb:ShapeL
sh') T v a
_) | ShapeL
sh forall a. Eq a => a -> a -> Bool
== ShapeL
sh' =
forall (v :: * -> *) a.
(HasCallStack, Vector v, VecElem v a) =>
ShapeL -> v a -> Array v a
fromVector (Int
saforall a. Num a => a -> a -> a
+Int
sb forall a. a -> [a] -> [a]
: ShapeL
sh) (forall (v :: * -> *) a.
(Vector v, VecElem v a) =>
v a -> v a -> v a
vAppend (forall (v :: * -> *) a. (Vector v, VecElem v a) => Array v a -> v a
toVector Array v a
a) (forall (v :: * -> *) a. (Vector v, VecElem v a) => Array v a -> v a
toVector Array v a
b))
append Array v a
_ Array v a
_ = forall a. HasCallStack => String -> a
error String
"append: bad shape"
{-# INLINE concatOuter #-}
concatOuter :: (HasCallStack, Vector v, VecElem v a) => [Array v a] -> Array v a
concatOuter :: forall (v :: * -> *) a.
(HasCallStack, Vector v, VecElem v a) =>
[Array v a] -> Array v a
concatOuter [] = forall a. HasCallStack => String -> a
error String
"concatOuter: empty list"
concatOuter [Array v a]
as | Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ forall a. Eq a => [a] -> Bool
allSame forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a. [a] -> [a]
tail [ShapeL]
shs =
forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ String
"concatOuter: non-conforming inner dimensions: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show [ShapeL]
shs
| Bool
otherwise = forall (v :: * -> *) a.
(HasCallStack, Vector v, VecElem v a) =>
ShapeL -> v a -> Array v a
fromVector ShapeL
sh' forall a b. (a -> b) -> a -> b
$ forall (v :: * -> *) a. (Vector v, VecElem v a) => [v a] -> v a
vConcat forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall (v :: * -> *) a. (Vector v, VecElem v a) => Array v a -> v a
toVector [Array v a]
as
where shs :: [ShapeL]
shs@(ShapeL
sh:[ShapeL]
_) = forall a b. (a -> b) -> [a] -> [b]
map forall (v :: * -> *) a. Array v a -> ShapeL
shapeL [Array v a]
as
sh' :: ShapeL
sh' = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum (forall a b. (a -> b) -> [a] -> [b]
map forall a. [a] -> a
head [ShapeL]
shs) forall a. a -> [a] -> [a]
: forall a. [a] -> [a]
tail ShapeL
sh
{-# INLINE ravel #-}
ravel :: (HasCallStack, Vector v, Vector v', VecElem v a, VecElem v' (Array v a)) =>
Array v' (Array v a) -> Array v a
ravel :: forall (v :: * -> *) (v' :: * -> *) a.
(HasCallStack, Vector v, Vector v', VecElem v a,
VecElem v' (Array v a)) =>
Array v' (Array v a) -> Array v a
ravel Array v' (Array v a)
aa | forall (v :: * -> *) a. Array v a -> Int
rank Array v' (Array v a)
aa forall a. Eq a => a -> a -> Bool
/= Int
1 = forall a. HasCallStack => String -> a
error String
"ravel: outermost array does not have rank 1"
| Bool
otherwise =
case forall (v :: * -> *) a. (Vector v, VecElem v a) => Array v a -> [a]
toList Array v' (Array v a)
aa of
[] -> forall a. HasCallStack => String -> a
error String
"ravel: empty array"
[Array v a]
as | Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ forall a. Eq a => [a] -> Bool
allSame [ShapeL]
shs -> forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ String
"ravel: non-conforming inner dimensions: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show [ShapeL]
shs
| Bool
otherwise -> forall (v :: * -> *) a.
(HasCallStack, Vector v, VecElem v a) =>
ShapeL -> v a -> Array v a
fromVector ShapeL
sh' forall a b. (a -> b) -> a -> b
$ forall (v :: * -> *) a. (Vector v, VecElem v a) => [v a] -> v a
vConcat forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall (v :: * -> *) a. (Vector v, VecElem v a) => Array v a -> v a
toVector [Array v a]
as
where shs :: [ShapeL]
shs@(ShapeL
sh:[ShapeL]
_) = forall a b. (a -> b) -> [a] -> [b]
map forall (v :: * -> *) a. Array v a -> ShapeL
shapeL [Array v a]
as
sh' :: ShapeL
sh' = forall (t :: * -> *) a. Foldable t => t a -> Int
length [Array v a]
as forall a. a -> [a] -> [a]
: ShapeL
sh
{-# INLINE unravel #-}
unravel :: (Vector v, Vector v', VecElem v a, VecElem v' (Array v a)) =>
Array v a -> Array v' (Array v a)
unravel :: forall (v :: * -> *) (v' :: * -> *) a.
(Vector v, Vector v', VecElem v a, VecElem v' (Array v a)) =>
Array v a -> Array v' (Array v a)
unravel = forall (v :: * -> *) (v' :: * -> *) a b.
(HasCallStack, Vector v, Vector v', VecElem v a, VecElem v' b) =>
Int -> (Array v a -> Array v' b) -> Array v a -> Array v' b
rerank Int
1 forall (v :: * -> *) a. (Vector v, VecElem v a) => a -> Array v a
scalar
{-# INLINE window #-}
window :: (HasCallStack, Vector v) => [Int] -> Array v a -> Array v a
window :: forall (v :: * -> *) a.
(HasCallStack, Vector v) =>
ShapeL -> Array v a -> Array v a
window ShapeL
aws (A ShapeL
ash (T ShapeL
ss Int
o v a
v)) = forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A (ShapeL -> ShapeL -> ShapeL
win ShapeL
aws ShapeL
ash) (forall (v :: * -> *) a. ShapeL -> Int -> v a -> T v a
T (ShapeL
ss' forall a. [a] -> [a] -> [a]
++ ShapeL
ss) Int
o v a
v)
where ss' :: ShapeL
ss' = forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith forall a b. a -> b -> a
const ShapeL
ss ShapeL
aws
win :: ShapeL -> ShapeL -> ShapeL
win (Int
w:ShapeL
ws) (Int
s:ShapeL
sh) | Int
w forall a. Ord a => a -> a -> Bool
<= Int
s = Int
s forall a. Num a => a -> a -> a
- Int
w forall a. Num a => a -> a -> a
+ Int
1 forall a. a -> [a] -> [a]
: ShapeL -> ShapeL -> ShapeL
win ShapeL
ws ShapeL
sh
| Bool
otherwise = forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ String
"window: bad window size : " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (Int
w, Int
s)
win [] ShapeL
sh = ShapeL
aws forall a. [a] -> [a] -> [a]
++ ShapeL
sh
win ShapeL
_ ShapeL
_ = forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ String
"window: rank mismatch: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (ShapeL
aws, ShapeL
ash)
{-# INLINE stride #-}
stride :: (HasCallStack, Vector v) => [Int] -> Array v a -> Array v a
stride :: forall (v :: * -> *) a.
(HasCallStack, Vector v) =>
ShapeL -> Array v a -> Array v a
stride ShapeL
ats (A ShapeL
ash (T ShapeL
ss Int
o v a
v)) = forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A (forall {a}. Integral a => [a] -> [a] -> [a]
str ShapeL
ats ShapeL
ash) (forall (v :: * -> *) a. ShapeL -> Int -> v a -> T v a
T (forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith forall a. Num a => a -> a -> a
(*) (ShapeL
ats forall a. [a] -> [a] -> [a]
++ forall a. a -> [a]
repeat Int
1) ShapeL
ss) Int
o v a
v)
where str :: [a] -> [a] -> [a]
str (a
t:[a]
ts) (a
s:[a]
sh) = (a
sforall a. Num a => a -> a -> a
+a
tforall a. Num a => a -> a -> a
-a
1) forall a. Integral a => a -> a -> a
`quot` a
t forall a. a -> [a] -> [a]
: [a] -> [a] -> [a]
str [a]
ts [a]
sh
str [] [a]
sh = [a]
sh
str [a]
_ [a]
_ = forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ String
"stride: rank mismatch: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (ShapeL
ats, ShapeL
ash)
{-# INLINE rotate #-}
rotate :: (HasCallStack, Vector v, VecElem v a) => Int -> Int -> Array v a -> Array v a
rotate :: forall (v :: * -> *) a.
(HasCallStack, Vector v, VecElem v a) =>
Int -> Int -> Array v a -> Array v a
rotate Int
d Int
k Array v a
a | Int
d forall a. Ord a => a -> a -> Bool
< forall (v :: * -> *) a. Array v a -> Int
rank Array v a
a, Int
k forall a. Ord a => a -> a -> Bool
>= Int
0 = forall (v :: * -> *) (v' :: * -> *) a b.
(HasCallStack, Vector v, Vector v', VecElem v a, VecElem v' b) =>
Int -> (Array v a -> Array v' b) -> Array v a -> Array v' b
rerank Int
d forall {v :: * -> *} {a}.
(VecElem v a, Vector v) =>
Array v a -> Array v a
f Array v a
a
where
f :: Array v a -> Array v a
f Array v a
arr = let Int
h:ShapeL
t = forall (v :: * -> *) a. Array v a -> ShapeL
shapeL Array v a
arr
m :: Int
m = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
product ShapeL
t
n :: Int
n = Int
h forall a. Num a => a -> a -> a
* Int
m
in forall (v :: * -> *) a.
HasCallStack =>
ShapeL -> Array v a -> Array v a
rev [Int
0]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (v :: * -> *) a.
(HasCallStack, Vector v, VecElem v a) =>
ShapeL -> Array v a -> Array v a
reshape (Int
kforall a. a -> [a] -> [a]
:Int
hforall a. a -> [a] -> [a]
:ShapeL
t)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (v :: * -> *) a.
(HasCallStack, Vector v) =>
ShapeL -> Array v a -> Array v a
stride [Int
n forall a. Num a => a -> a -> a
+ Int
m]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (v :: * -> *) a.
(HasCallStack, Vector v) =>
ShapeL -> Array v a -> Array v a
window [Int
n]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (v :: * -> *) a.
(HasCallStack, Vector v, VecElem v a) =>
ShapeL -> Array v a -> Array v a
reshape [(Int
k forall a. Num a => a -> a -> a
+ Int
1) forall a. Num a => a -> a -> a
* Int
n]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (v :: * -> *) a.
HasCallStack =>
Int -> Array v a -> Array v a
stretchOuter (Int
k forall a. Num a => a -> a -> a
+ Int
1)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (v :: * -> *) a.
(HasCallStack, Vector v, VecElem v a) =>
ShapeL -> Array v a -> Array v a
reshape (Int
1forall a. a -> [a] -> [a]
:Int
hforall a. a -> [a] -> [a]
:ShapeL
t) forall a b. (a -> b) -> a -> b
$ Array v a
arr
rotate Int
d Int
k Array v a
a = forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ String
"Incorrect arguments to rotate: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (Int
d, Int
k, forall (v :: * -> *) a. Array v a -> Int
rank Array v a
a)
{-# INLINE slice #-}
slice :: (HasCallStack) => [(Int, Int)] -> Array v a -> Array v a
slice :: forall (v :: * -> *) a.
HasCallStack =>
[(Int, Int)] -> Array v a -> Array v a
slice [(Int, Int)]
asl (A ShapeL
ash (T ShapeL
ats Int
ao v a
v)) = forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A ShapeL
rsh (forall (v :: * -> *) a. ShapeL -> Int -> v a -> T v a
T ShapeL
ats Int
o v a
v)
where (Int
o, ShapeL
rsh) = [(Int, Int)] -> ShapeL -> ShapeL -> (Int, ShapeL)
slc [(Int, Int)]
asl ShapeL
ash ShapeL
ats
slc :: [(Int, Int)] -> ShapeL -> ShapeL -> (Int, ShapeL)
slc ((Int
k,Int
n):[(Int, Int)]
sl) (Int
s:ShapeL
sh) (Int
t:ShapeL
ts) | Int
k forall a. Ord a => a -> a -> Bool
< Int
0 Bool -> Bool -> Bool
|| Int
k forall a. Ord a => a -> a -> Bool
> Int
s Bool -> Bool -> Bool
|| Int
kforall a. Num a => a -> a -> a
+Int
n forall a. Ord a => a -> a -> Bool
> Int
s = forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ String
"slice: out of bounds: slice=" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (Int
k, Int
n) forall a. [a] -> [a] -> [a]
++ String
" size=" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Int
s
| Bool
otherwise = (Int
i forall a. Num a => a -> a -> a
+ Int
kforall a. Num a => a -> a -> a
*Int
t, Int
nforall a. a -> [a] -> [a]
:ShapeL
ns) where (Int
i, ShapeL
ns) = [(Int, Int)] -> ShapeL -> ShapeL -> (Int, ShapeL)
slc [(Int, Int)]
sl ShapeL
sh ShapeL
ts
slc ((Int, Int)
_:[(Int, Int)]
_) [] ShapeL
_ = forall a. HasCallStack => String -> a
error String
"slice: slice list too long"
slc [] ShapeL
sh ShapeL
_ = (Int
ao, ShapeL
sh)
slc [(Int, Int)]
_ ShapeL
_ ShapeL
_ = forall a. HasCallStack => String -> a
error String
"impossible"
{-# INLINE rerank #-}
rerank :: (HasCallStack, Vector v, Vector v', VecElem v a, VecElem v' b) =>
Int -> (Array v a -> Array v' b) -> Array v a -> Array v' b
rerank :: forall (v :: * -> *) (v' :: * -> *) a b.
(HasCallStack, Vector v, Vector v', VecElem v a, VecElem v' b) =>
Int -> (Array v a -> Array v' b) -> Array v a -> Array v' b
rerank Int
n Array v a -> Array v' b
f (A ShapeL
sh T v a
t) | Int
n forall a. Ord a => a -> a -> Bool
< Int
0 Bool -> Bool -> Bool
|| Int
n forall a. Ord a => a -> a -> Bool
> forall (t :: * -> *) a. Foldable t => t a -> Int
length ShapeL
sh = forall a. HasCallStack => String -> a
error String
"rerank: rank exceeded"
| Bool
otherwise =
forall (v :: * -> *) a.
(HasCallStack, Vector v, VecElem v a) =>
ShapeL -> [Array v a] -> Array v a
ravelOuter ShapeL
osh forall a b. (a -> b) -> a -> b
$
forall a b. (a -> b) -> [a] -> [b]
map (Array v a -> Array v' b
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A ShapeL
ish) forall a b. (a -> b) -> a -> b
$
forall (v :: * -> *) a. ShapeL -> T v a -> [T v a]
subArraysT ShapeL
osh T v a
t
where (ShapeL
osh, ShapeL
ish) = forall a. Int -> [a] -> ([a], [a])
splitAt Int
n ShapeL
sh
ravelOuter :: (HasCallStack, Vector v, VecElem v a) => ShapeL -> [Array v a] -> Array v a
ravelOuter :: forall (v :: * -> *) a.
(HasCallStack, Vector v, VecElem v a) =>
ShapeL -> [Array v a] -> Array v a
ravelOuter ShapeL
_ [] = forall a. HasCallStack => String -> a
error String
"ravelOuter: empty list"
ravelOuter ShapeL
osh [Array v a]
as | Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ forall a. Eq a => [a] -> Bool
allSame [ShapeL]
shs = forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ String
"ravelOuter: non-conforming inner dimensions: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show [ShapeL]
shs
| Bool
otherwise = forall (v :: * -> *) a.
(HasCallStack, Vector v, VecElem v a) =>
ShapeL -> v a -> Array v a
fromVector ShapeL
sh' forall a b. (a -> b) -> a -> b
$ forall (v :: * -> *) a. (Vector v, VecElem v a) => [v a] -> v a
vConcat forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall (v :: * -> *) a. (Vector v, VecElem v a) => Array v a -> v a
toVector [Array v a]
as
where shs :: [ShapeL]
shs@(ShapeL
sh:[ShapeL]
_) = forall a b. (a -> b) -> [a] -> [b]
map forall (v :: * -> *) a. Array v a -> ShapeL
shapeL [Array v a]
as
sh' :: ShapeL
sh' = ShapeL
osh forall a. [a] -> [a] -> [a]
++ ShapeL
sh
{-# INLINE rerank2 #-}
rerank2 :: (HasCallStack, Vector v, VecElem v a, VecElem v b, VecElem v c) =>
Int -> (Array v a -> Array v b -> Array v c) -> Array v a -> Array v b -> Array v c
rerank2 :: forall (v :: * -> *) a b c.
(HasCallStack, Vector v, VecElem v a, VecElem v b, VecElem v c) =>
Int
-> (Array v a -> Array v b -> Array v c)
-> Array v a
-> Array v b
-> Array v c
rerank2 Int
n Array v a -> Array v b -> Array v c
f (A ShapeL
sha T v a
ta) (A ShapeL
shb T v b
tb) | Int
n forall a. Ord a => a -> a -> Bool
< Int
0 Bool -> Bool -> Bool
|| Int
n forall a. Ord a => a -> a -> Bool
> forall (t :: * -> *) a. Foldable t => t a -> Int
length ShapeL
sha Bool -> Bool -> Bool
|| Int
n forall a. Ord a => a -> a -> Bool
> forall (t :: * -> *) a. Foldable t => t a -> Int
length ShapeL
shb = forall a. HasCallStack => String -> a
error String
"rerank: rank exceeded"
| forall a. Int -> [a] -> [a]
take Int
n ShapeL
sha forall a. Eq a => a -> a -> Bool
/= forall a. Int -> [a] -> [a]
take Int
n ShapeL
shb = forall a. HasCallStack => String -> a
error String
"rerank2: shape mismatch"
| Bool
otherwise =
forall (v :: * -> *) a.
(HasCallStack, Vector v, VecElem v a) =>
ShapeL -> [Array v a] -> Array v a
ravelOuter ShapeL
osh forall a b. (a -> b) -> a -> b
$
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\ T v a
a T v b
b -> Array v a -> Array v b -> Array v c
f (forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A ShapeL
isha T v a
a) (forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A ShapeL
ishb T v b
b))
(forall (v :: * -> *) a. ShapeL -> T v a -> [T v a]
subArraysT ShapeL
osh T v a
ta)
(forall (v :: * -> *) a. ShapeL -> T v a -> [T v a]
subArraysT ShapeL
osh T v b
tb)
where (ShapeL
osh, ShapeL
isha) = forall a. Int -> [a] -> ([a], [a])
splitAt Int
n ShapeL
sha
ishb :: ShapeL
ishb = forall a. Int -> [a] -> [a]
drop Int
n ShapeL
shb
{-# INLINE rev #-}
rev :: (HasCallStack) => [Int] -> Array v a -> Array v a
rev :: forall (v :: * -> *) a.
HasCallStack =>
ShapeL -> Array v a -> Array v a
rev ShapeL
rs (A ShapeL
sh T v a
t) | forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (\ Int
r -> Int
r forall a. Ord a => a -> a -> Bool
>= Int
0 Bool -> Bool -> Bool
&& Int
r forall a. Ord a => a -> a -> Bool
< Int
n) ShapeL
rs = forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A ShapeL
sh (forall (v :: * -> *) a. ShapeL -> ShapeL -> T v a -> T v a
reverseT ShapeL
rs ShapeL
sh T v a
t)
| Bool
otherwise = forall a. HasCallStack => String -> a
error String
"reverse: bad reverse dimension"
where n :: Int
n = forall (t :: * -> *) a. Foldable t => t a -> Int
length ShapeL
sh
{-# INLINE reduce #-}
reduce :: (Vector v, VecElem v a) =>
(a -> a -> a) -> a -> Array v a -> Array v a
reduce :: forall (v :: * -> *) a.
(Vector v, VecElem v a) =>
(a -> a -> a) -> a -> Array v a -> Array v a
reduce a -> a -> a
f a
z (A ShapeL
sh T v a
t) = forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A [] forall a b. (a -> b) -> a -> b
$ forall (v :: * -> *) a.
(Vector v, VecElem v a) =>
ShapeL -> (a -> a -> a) -> a -> T v a -> T v a
reduceT ShapeL
sh a -> a -> a
f a
z T v a
t
{-# INLINE foldrA #-}
foldrA :: (Vector v, VecElem v a) => (a -> b -> b) -> b -> Array v a -> b
foldrA :: forall (v :: * -> *) a b.
(Vector v, VecElem v a) =>
(a -> b -> b) -> b -> Array v a -> b
foldrA a -> b -> b
f b
z (A ShapeL
sh T v a
t) = forall (v :: * -> *) a b.
(Vector v, VecElem v a) =>
ShapeL -> (a -> b -> b) -> b -> T v a -> b
foldrT ShapeL
sh a -> b -> b
f b
z T v a
t
{-# INLINE traverseA #-}
traverseA
:: (Vector v, VecElem v a, VecElem v b, Applicative f)
=> (a -> f b) -> Array v a -> f (Array v b)
traverseA :: forall (v :: * -> *) a b (f :: * -> *).
(Vector v, VecElem v a, VecElem v b, Applicative f) =>
(a -> f b) -> Array v a -> f (Array v b)
traverseA a -> f b
f (A ShapeL
sh T v a
t) = forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A ShapeL
sh forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (v :: * -> *) a b (f :: * -> *).
(Vector v, VecElem v a, VecElem v b, Applicative f) =>
ShapeL -> (a -> f b) -> T v a -> f (T v b)
traverseT ShapeL
sh a -> f b
f T v a
t
allSameA :: (Vector v, VecElem v a, Eq a) => Array v a -> Bool
allSameA :: forall (v :: * -> *) a.
(Vector v, VecElem v a, Eq a) =>
Array v a -> Bool
allSameA (A ShapeL
sh T v a
t) = forall (v :: * -> *) a.
(Vector v, VecElem v a, Eq a) =>
ShapeL -> T v a -> Bool
allSameT ShapeL
sh T v a
t
instance (Vector v, VecElem v a, Arbitrary a) => Arbitrary (Array v a) where
arbitrary :: Gen (Array v a)
arbitrary = do
Int
r <- forall a. Random a => (a, a) -> Gen a
choose (Int
0, Int
5)
ShapeL
ss <- forall (m :: * -> *) a. Applicative m => Int -> m a -> m [a]
replicateM Int
r (forall a. Small a -> a
getSmall forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Positive a -> a
getPositive forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Arbitrary a => Gen a
arbitrary) forall a. Gen a -> (a -> Bool) -> Gen a
`suchThat` ((forall a. Ord a => a -> a -> Bool
< Int
10000) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
product)
forall (v :: * -> *) a.
(HasCallStack, Vector v, VecElem v a) =>
ShapeL -> [a] -> Array v a
fromList ShapeL
ss forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Arbitrary a => Int -> Gen [a]
vector (forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
product ShapeL
ss)
{-# INLINE sumA #-}
sumA :: (Vector v, VecElem v a, Num a) => Array v a -> a
sumA :: forall (v :: * -> *) a.
(Vector v, VecElem v a, Num a) =>
Array v a -> a
sumA (A ShapeL
sh T v a
t) = forall (v :: * -> *) a.
(Vector v, VecElem v a, Num a) =>
ShapeL -> T v a -> a
sumT ShapeL
sh T v a
t
{-# INLINE productA #-}
productA :: (Vector v, VecElem v a, Num a) => Array v a -> a
productA :: forall (v :: * -> *) a.
(Vector v, VecElem v a, Num a) =>
Array v a -> a
productA (A ShapeL
sh T v a
t) = forall (v :: * -> *) a.
(Vector v, VecElem v a, Num a) =>
ShapeL -> T v a -> a
productT ShapeL
sh T v a
t
{-# INLINE maximumA #-}
maximumA :: (HasCallStack, Vector v, VecElem v a, Ord a) => Array v a -> a
maximumA :: forall (v :: * -> *) a.
(HasCallStack, Vector v, VecElem v a, Ord a) =>
Array v a -> a
maximumA a :: Array v a
a@(A ShapeL
sh T v a
t) | forall (v :: * -> *) a. Array v a -> Int
size Array v a
a forall a. Ord a => a -> a -> Bool
> Int
0 = forall (v :: * -> *) a.
(Vector v, VecElem v a, Ord a) =>
ShapeL -> T v a -> a
maximumT ShapeL
sh T v a
t
| Bool
otherwise = forall a. HasCallStack => String -> a
error String
"maximumA called with empty array"
{-# INLINE minimumA #-}
minimumA :: (HasCallStack, Vector v, VecElem v a, Ord a) => Array v a -> a
minimumA :: forall (v :: * -> *) a.
(HasCallStack, Vector v, VecElem v a, Ord a) =>
Array v a -> a
minimumA a :: Array v a
a@(A ShapeL
sh T v a
t) | forall (v :: * -> *) a. Array v a -> Int
size Array v a
a forall a. Ord a => a -> a -> Bool
> Int
0 = forall (v :: * -> *) a.
(Vector v, VecElem v a, Ord a) =>
ShapeL -> T v a -> a
minimumT ShapeL
sh T v a
t
| Bool
otherwise = forall a. HasCallStack => String -> a
error String
"minimumA called with empty array"
{-# INLINE anyA #-}
anyA :: (Vector v, VecElem v a) => (a -> Bool) -> Array v a -> Bool
anyA :: forall (v :: * -> *) a.
(Vector v, VecElem v a) =>
(a -> Bool) -> Array v a -> Bool
anyA a -> Bool
p (A ShapeL
sh T v a
t) = forall (v :: * -> *) a.
(Vector v, VecElem v a) =>
ShapeL -> (a -> Bool) -> T v a -> Bool
anyT ShapeL
sh a -> Bool
p T v a
t
{-# INLINE allA #-}
allA :: (Vector v, VecElem v a) => (a -> Bool) -> Array v a -> Bool
allA :: forall (v :: * -> *) a.
(Vector v, VecElem v a) =>
(a -> Bool) -> Array v a -> Bool
allA a -> Bool
p (A ShapeL
sh T v a
t) = forall (v :: * -> *) a.
(Vector v, VecElem v a) =>
ShapeL -> (a -> Bool) -> T v a -> Bool
allT ShapeL
sh a -> Bool
p T v a
t
broadcast :: (HasCallStack, Vector v, VecElem v a) =>
[Int] -> ShapeL -> Array v a -> Array v a
broadcast :: forall (v :: * -> *) a.
(HasCallStack, Vector v, VecElem v a) =>
ShapeL -> ShapeL -> Array v a -> Array v a
broadcast ShapeL
ds ShapeL
sh Array v a
a | forall (t :: * -> *) a. Foldable t => t a -> Int
length ShapeL
ds forall a. Eq a => a -> a -> Bool
/= forall (v :: * -> *) a. Array v a -> Int
rank Array v a
a = forall a. HasCallStack => String -> a
error String
"broadcast: wrong number of broadcasts"
| forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (\ Int
d -> Int
d forall a. Ord a => a -> a -> Bool
< Int
0 Bool -> Bool -> Bool
|| Int
d forall a. Ord a => a -> a -> Bool
>= Int
r) ShapeL
ds = forall a. HasCallStack => String -> a
error String
"broadcast: bad dimension index"
| Bool -> Bool
not (forall {a}. Ord a => [a] -> Bool
ascending ShapeL
ds) = forall a. HasCallStack => String -> a
error String
"broadcast: unordered dimensions"
| Bool
otherwise = forall (v :: * -> *) a.
HasCallStack =>
ShapeL -> Array v a -> Array v a
stretch ShapeL
sh forall a b. (a -> b) -> a -> b
$ forall (v :: * -> *) a.
(HasCallStack, Vector v, VecElem v a) =>
ShapeL -> Array v a -> Array v a
reshape ShapeL
rsh Array v a
a
where r :: Int
r = forall (t :: * -> *) a. Foldable t => t a -> Int
length ShapeL
sh
rsh :: ShapeL
rsh = [ if Int
i forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` ShapeL
ds then Int
s else Int
1 | (Int
i, Int
s) <- forall a b. [a] -> [b] -> [(a, b)]
zip [Int
0..] ShapeL
sh ]
ascending :: [a] -> Bool
ascending (a
x:a
y:[a]
ys) = a
x forall a. Ord a => a -> a -> Bool
< a
y Bool -> Bool -> Bool
&& [a] -> Bool
ascending (a
yforall a. a -> [a] -> [a]
:[a]
ys)
ascending [a]
_ = Bool
True
update :: (HasCallStack, Vector v, VecElem v a) =>
Array v a -> [([Int], a)] -> Array v a
update :: forall (v :: * -> *) a.
(HasCallStack, Vector v, VecElem v a) =>
Array v a -> [(ShapeL, a)] -> Array v a
update (A ShapeL
sh T v a
t) [(ShapeL, a)]
us | forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (ShapeL -> Bool
ok forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> a
fst) [(ShapeL, a)]
us = forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A ShapeL
sh forall a b. (a -> b) -> a -> b
$ forall (v :: * -> *) a.
(Vector v, VecElem v a) =>
ShapeL -> T v a -> [(ShapeL, a)] -> T v a
updateT ShapeL
sh T v a
t [(ShapeL, a)]
us
| Bool
otherwise = forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ String
"update: index out of bounds " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShapeL -> Bool
ok) forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a b. (a, b) -> a
fst [(ShapeL, a)]
us)
where ok :: ShapeL -> Bool
ok ShapeL
is = forall (t :: * -> *) a. Foldable t => t a -> Int
length ShapeL
is forall a. Eq a => a -> a -> Bool
== Int
r Bool -> Bool -> Bool
&& forall (t :: * -> *). Foldable t => t Bool -> Bool
and (forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\ Int
i Int
s -> Int
0 forall a. Ord a => a -> a -> Bool
<= Int
i Bool -> Bool -> Bool
&& Int
i forall a. Ord a => a -> a -> Bool
< Int
s) ShapeL
is ShapeL
sh)
r :: Int
r = forall (t :: * -> *) a. Foldable t => t a -> Int
length ShapeL
sh
{-# INLINE generate #-}
generate :: (Vector v, VecElem v a) =>
ShapeL -> ([Int] -> a) -> Array v a
generate :: forall (v :: * -> *) a.
(Vector v, VecElem v a) =>
ShapeL -> (ShapeL -> a) -> Array v a
generate ShapeL
sh = forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A ShapeL
sh forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (v :: * -> *) a.
(Vector v, VecElem v a) =>
ShapeL -> (ShapeL -> a) -> T v a
generateT ShapeL
sh
{-# INLINE iterateN #-}
iterateN :: forall v a .
(Vector v, VecElem v a) =>
Int -> (a -> a) -> a -> Array v a
iterateN :: forall (v :: * -> *) a.
(Vector v, VecElem v a) =>
Int -> (a -> a) -> a -> Array v a
iterateN Int
n a -> a
f = forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A [Int
n] forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (v :: * -> *) a.
(Vector v, VecElem v a) =>
Int -> (a -> a) -> a -> T v a
iterateNT Int
n a -> a
f
{-# INLINE iota #-}
iota :: forall v a .
(Vector v, VecElem v a, Enum a, Num a) =>
Int -> Array v a
iota :: forall (v :: * -> *) a.
(Vector v, VecElem v a, Enum a, Num a) =>
Int -> Array v a
iota Int
n = forall (v :: * -> *) a. ShapeL -> T v a -> Array v a
A [Int
n] forall a b. (a -> b) -> a -> b
$ forall (v :: * -> *) a.
(Vector v, VecElem v a, Enum a, Num a) =>
Int -> T v a
iotaT Int
n