{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE RoleAnnotations #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE ViewPatterns #-}
{-# OPTIONS_GHC -fno-warn-incomplete-uni-patterns #-}
module Harpie.Array.Generic
(
Array (..),
array,
(><),
validate,
safeArray,
unsafeArray,
unsafeArrayL,
unsafeModifyShape,
unsafeModifyVector,
Dim,
Dims,
asVector,
arrayV,
shape,
rank,
size,
length,
isNull,
index,
(!),
(!?),
tabulate,
backpermute,
fromScalar,
toScalar,
isScalar,
asSingleton,
asScalar,
empty,
range,
corange,
indices,
ident,
konst,
singleton,
diag,
undiag,
fmapA,
foldrA,
toListA,
zipWith,
zipWithSafe,
modify,
imap,
rowWise,
colWise,
dimsWise,
take,
drop,
select,
insert,
delete,
append,
prepend,
concatenate,
couple,
slice,
rotate,
takes,
drops,
indexes,
slices,
heads,
lasts,
tails,
inits,
extracts,
reduces,
joins,
joinsSafe,
join,
joinSafe,
traverses,
maps,
filters,
zips,
zipsSafe,
modifies,
diffs,
expand,
coexpand,
contract,
prod,
dot,
mult,
windows,
find,
findNoOverlap,
findIndices,
isPrefixOf,
isSuffixOf,
isInfixOf,
fill,
cut,
cutSuffix,
pad,
lpad,
reshape,
flat,
repeat,
cycle,
rerank,
reorder,
squeeze,
elongate,
transpose,
inflate,
intercalate,
intersperse,
concats,
reverses,
rotates,
sorts,
sortsBy,
orders,
ordersBy,
transmit,
transmitSafe,
transmitOp,
telecasts,
telecastsSafe,
pattern (:<),
cons,
uncons,
pattern (:>),
snoc,
unsnoc,
iota,
uniform,
)
where
import Control.Monad hiding (join)
import Data.Bool
import Data.Foldable hiding (find, length, minimum)
import Data.Function
import Data.List qualified as List
import Data.Ord (comparing)
import Data.Vector.Algorithms.Intro (sortBy)
import Data.Vector.Generic qualified as VG
import Data.Vector.Unboxed qualified as VU
import GHC.Generics
import Harpie.Shape hiding (asScalar, asSingleton, concatenate, range, rank, reorder, rerank, rotate, size, squeeze)
import Harpie.Shape qualified as S
import NumHask.Algebra.Additive qualified as Add
import NumHask.Algebra.Multiplicative qualified as Mult
import Prettyprinter hiding (dot, fill)
import System.Random hiding (uniform)
import System.Random.Stateful hiding (uniform)
import Prelude as P hiding (cycle, drop, length, repeat, take, zip, zipWith)
data Array v a = UnsafeArray !(VU.Vector Int) !(VU.Vector Int) !(v a)
deriving stock ((forall x. Array v a -> Rep (Array v a) x)
-> (forall x. Rep (Array v a) x -> Array v a)
-> Generic (Array v a)
forall x. Rep (Array v a) x -> Array v a
forall x. Array v a -> Rep (Array v a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall k (v :: k -> *) (a :: k) x. Rep (Array v a) x -> Array v a
forall k (v :: k -> *) (a :: k) x. Array v a -> Rep (Array v a) x
$cfrom :: forall k (v :: k -> *) (a :: k) x. Array v a -> Rep (Array v a) x
from :: forall x. Array v a -> Rep (Array v a) x
$cto :: forall k (v :: k -> *) (a :: k) x. Rep (Array v a) x -> Array v a
to :: forall x. Rep (Array v a) x -> Array v a
Generic)
type role Array representational nominal
instance (Eq (v a)) => Eq (Array v a) where
(UnsafeArray Vector Int
s Vector Int
_ v a
v) == :: Array v a -> Array v a -> Bool
== (UnsafeArray Vector Int
s' Vector Int
_ v a
v') = Vector Int
s Vector Int -> Vector Int -> Bool
forall a. Eq a => a -> a -> Bool
== Vector Int
s' Bool -> Bool -> Bool
&& v a
v v a -> v a -> Bool
forall a. Eq a => a -> a -> Bool
== v a
v'
instance (Ord (v a)) => Ord (Array v a) where
compare :: Array v a -> Array v a -> Ordering
compare (UnsafeArray Vector Int
s Vector Int
_ v a
v) (UnsafeArray Vector Int
s' Vector Int
_ v a
v') = Vector Int -> Vector Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Vector Int
s Vector Int
s' Ordering -> Ordering -> Ordering
forall a. Semigroup a => a -> a -> a
<> v a -> v a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare v a
v v a
v'
instance (Show (v a)) => Show (Array v a) where
showsPrec :: Int -> Array v a -> ShowS
showsPrec Int
p (UnsafeArray Vector Int
s Vector Int
_ v a
v) =
Bool -> ShowS -> ShowS
showParen (Int
p Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$
String -> ShowS
showString String
"UnsafeArray " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int] -> ShowS
forall a. Show a => a -> ShowS
shows (Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList Vector Int
s) ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
" " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v a -> ShowS
forall a. Show a => a -> ShowS
shows v a
v
unsafeArray :: VU.Vector Int -> v a -> Array v a
unsafeArray :: forall {k} (v :: k -> *) (a :: k). Vector Int -> v a -> Array v a
unsafeArray Vector Int
s v a
v = Vector Int -> Vector Int -> v a -> Array v a
forall {k} (v :: k -> *) (a :: k).
Vector Int -> Vector Int -> v a -> Array v a
UnsafeArray Vector Int
s (Int -> Vector Int -> Vector Int
forall a. Unbox a => Int -> Vector a -> Vector a
VU.drop Int
1 ((Int -> Int -> Int) -> Int -> Vector Int -> Vector Int
forall a b.
(Unbox a, Unbox b) =>
(a -> b -> b) -> b -> Vector a -> Vector b
VU.scanr Int -> Int -> Int
forall a. Num a => a -> a -> a
(*) Int
1 Vector Int
s)) v a
v
{-# INLINE unsafeArray #-}
unsafeArrayL :: [Int] -> v a -> Array v a
unsafeArrayL :: forall {k} (v :: k -> *) (a :: k). [Int] -> v a -> Array v a
unsafeArrayL [Int]
s = Vector Int -> v a -> Array v a
forall {k} (v :: k -> *) (a :: k). Vector Int -> v a -> Array v a
unsafeArray ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
s)
{-# INLINE unsafeArrayL #-}
fmapA :: (VG.Vector v a, VG.Vector v b) => (a -> b) -> Array v a -> Array v b
fmapA :: forall (v :: * -> *) a b.
(Vector v a, Vector v b) =>
(a -> b) -> Array v a -> Array v b
fmapA a -> b
f = (v a -> v b) -> Array v a -> Array v b
forall {k} {k} (v :: k -> *) (a :: k) (v' :: k -> *) (b :: k).
(v a -> v' b) -> Array v a -> Array v' b
unsafeModifyVector ((a -> b) -> v a -> v b
forall (v :: * -> *) a b.
(Vector v a, Vector v b) =>
(a -> b) -> v a -> v b
VG.map a -> b
f)
foldrA :: (VG.Vector v a) => (a -> b -> b) -> b -> Array v a -> b
foldrA :: forall (v :: * -> *) a b.
Vector v a =>
(a -> b -> b) -> b -> Array v a -> b
foldrA a -> b -> b
f b
x0 Array v a
a = (a -> b -> b) -> b -> v a -> b
forall (v :: * -> *) a b.
Vector v a =>
(a -> b -> b) -> b -> v a -> b
VG.foldr a -> b -> b
f b
x0 (Array v a -> v a
forall {k} (v :: k -> *) (a :: k). Array v a -> v a
asVector Array v a
a)
toListA :: (VG.Vector v a) => Array v a -> [a]
toListA :: forall (v :: * -> *) a. Vector v a => Array v a -> [a]
toListA = v a -> [a]
forall (v :: * -> *) a. Vector v a => v a -> [a]
VG.toList (v a -> [a]) -> (Array v a -> v a) -> Array v a -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array v a -> v a
forall {k} (v :: k -> *) (a :: k). Array v a -> v a
asVector
traverseA :: (Applicative f, VG.Vector v a, VG.Vector v b, VG.Vector v (f b)) => (a -> f b) -> Array v a -> f (Array v b)
traverseA :: forall (f :: * -> *) (v :: * -> *) a b.
(Applicative f, Vector v a, Vector v b, Vector v (f b)) =>
(a -> f b) -> Array v a -> f (Array v b)
traverseA a -> f b
f Array v a
a = Vector Int -> v b -> Array v b
forall {k} (v :: k -> *) (a :: k). Vector Int -> v a -> Array v a
unsafeArray (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a) (v b -> Array v b) -> ([b] -> v b) -> [b] -> Array v b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [b] -> v b
forall (v :: * -> *) a. Vector v a => [a] -> v a
VG.fromList ([b] -> Array v b) -> f [b] -> f (Array v b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [f b] -> f [b]
forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
forall (f :: * -> *) a. Applicative f => [f a] -> f [a]
sequenceA (v (f b) -> [f b]
forall (v :: * -> *) a. Vector v a => v a -> [a]
VG.toList ((a -> f b) -> v a -> v (f b)
forall (v :: * -> *) a b.
(Vector v a, Vector v b) =>
(a -> b) -> v a -> v b
VG.map a -> f b
f (Array v a -> v a
forall {k} (v :: k -> *) (a :: k). Array v a -> v a
asVector Array v a
a)))
instance (Show a, Show (v a), VG.Vector v a, VG.Vector v (Array v a)) => Pretty (Array v a) where
pretty :: forall ann. Array v a -> Doc ann
pretty a :: Array v a
a@(UnsafeArray Vector Int
_ Vector Int
_ v a
v) = case Array v a -> Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Int
rank Array v a
a of
Int
0 -> a -> Doc ann
forall a ann. Show a => a -> Doc ann
viaShow (v a -> a
forall (v :: * -> *) a. Vector v a => v a -> a
VG.head v a
v)
Int
1 -> v a -> Doc ann
forall a ann. Show a => a -> Doc ann
viaShow v a
v
Int
_ ->
String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"["
Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
indent
Int
0
( [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep
( Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ([Doc ann] -> [Doc ann]) -> [Doc ann] -> [Doc ann]
forall a b. (a -> b) -> a -> b
$
Array v a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Array v a -> Doc ann
pretty
(Array v a -> Doc ann) -> [Array v a] -> [Doc ann]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Array v (Array v a) -> [Array v a]
forall (v :: * -> *) a. Vector v a => Array v a -> [a]
toListA ([Int] -> Array v a -> Array v (Array v a)
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v a -> Array v (Array v a)
extracts [Int
0] Array v a
a)
)
)
Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"]"
instance (Num a, VG.Vector v a) => Num (Array v a) where
+ :: Array v a -> Array v a -> Array v a
(+) = (a -> a -> a) -> Array v a -> Array v a -> Array v a
forall (v :: * -> *) a b c.
(Vector v a, Vector v b, Vector v c) =>
(a -> b -> c) -> Array v a -> Array v b -> Array v c
zipWith a -> a -> a
forall a. Num a => a -> a -> a
(+)
(-) = (a -> a -> a) -> Array v a -> Array v a -> Array v a
forall (v :: * -> *) a b c.
(Vector v a, Vector v b, Vector v c) =>
(a -> b -> c) -> Array v a -> Array v b -> Array v c
zipWith (-)
* :: Array v a -> Array v a -> Array v a
(*) = String -> Array v a -> Array v a -> Array v a
forall a. HasCallStack => String -> a
error String
"multiplication not defined"
abs :: Array v a -> Array v a
abs = (a -> a) -> Array v a -> Array v a
forall (v :: * -> *) a b.
(Vector v a, Vector v b) =>
(a -> b) -> Array v a -> Array v b
fmapA a -> a
forall a. Num a => a -> a
abs
signum :: Array v a -> Array v a
signum = (a -> a) -> Array v a -> Array v a
forall (v :: * -> *) a b.
(Vector v a, Vector v b) =>
(a -> b) -> Array v a -> Array v b
fmapA a -> a
forall a. Num a => a -> a
signum
fromInteger :: Integer -> Array v a
fromInteger Integer
x = a -> Array v a
forall (v :: * -> *) a. Vector v a => a -> Array v a
toScalar (Integer -> a
forall a. Num a => Integer -> a
fromInteger Integer
x)
asVector :: Array v a -> v a
asVector :: forall {k} (v :: k -> *) (a :: k). Array v a -> v a
asVector (UnsafeArray Vector Int
_ Vector Int
_ v a
v) = v a
v
array :: (VG.Vector v a) => [Int] -> [a] -> Array v a
array :: forall (v :: * -> *) a. Vector v a => [Int] -> [a] -> Array v a
array [Int]
s [a]
xs = [Int] -> v a -> Array v a
forall {k} (v :: k -> *) (a :: k). [Int] -> v a -> Array v a
unsafeArrayL [Int]
s ([a] -> v a
forall (v :: * -> *) a. Vector v a => [a] -> v a
VG.fromList [a]
xs)
arrayV :: [Int] -> v a -> Array v a
arrayV :: forall {k} (v :: k -> *) (a :: k). [Int] -> v a -> Array v a
arrayV = [Int] -> v a -> Array v a
forall {k} (v :: k -> *) (a :: k). [Int] -> v a -> Array v a
unsafeArrayL
infixl 4 ><
(><) :: (VG.Vector v a) => [Int] -> [a] -> Array v a
>< :: forall (v :: * -> *) a. Vector v a => [Int] -> [a] -> Array v a
(><) = [Int] -> [a] -> Array v a
forall (v :: * -> *) a. Vector v a => [Int] -> [a] -> Array v a
array
validate :: (VG.Vector v a) => Array v a -> Bool
validate :: forall (v :: * -> *) a. Vector v a => Array v a -> Bool
validate Array v a
a = Array v a -> Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Int
size Array v a
a Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== v a -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
VG.length (Array v a -> v a
forall {k} (v :: k -> *) (a :: k). Array v a -> v a
asVector Array v a
a)
safeArray :: (VG.Vector v a) => [Int] -> [a] -> Maybe (Array v a)
safeArray :: forall (v :: * -> *) a.
Vector v a =>
[Int] -> [a] -> Maybe (Array v a)
safeArray [Int]
s [a]
xs =
Maybe (Array v a) -> Maybe (Array v a) -> Bool -> Maybe (Array v a)
forall a. a -> a -> Bool -> a
bool Maybe (Array v a)
forall a. Maybe a
Nothing (Array v a -> Maybe (Array v a)
forall a. a -> Maybe a
Just Array v a
a) (Array v a -> Bool
forall (v :: * -> *) a. Vector v a => Array v a -> Bool
validate Array v a
a)
where
a :: Array v a
a = [Int] -> [a] -> Array v a
forall (v :: * -> *) a. Vector v a => [Int] -> [a] -> Array v a
array [Int]
s [a]
xs
unsafeModifyShape :: (VU.Vector Int -> VU.Vector Int) -> Array v a -> Array v a
unsafeModifyShape :: forall {k} (v :: k -> *) (a :: k).
(Vector Int -> Vector Int) -> Array v a -> Array v a
unsafeModifyShape Vector Int -> Vector Int
f (UnsafeArray Vector Int
s Vector Int
_ v a
v) = Vector Int -> v a -> Array v a
forall {k} (v :: k -> *) (a :: k). Vector Int -> v a -> Array v a
unsafeArray (Vector Int -> Vector Int
f Vector Int
s) v a
v
unsafeModifyVector :: (v a -> v' b) -> Array v a -> Array v' b
unsafeModifyVector :: forall {k} {k} (v :: k -> *) (a :: k) (v' :: k -> *) (b :: k).
(v a -> v' b) -> Array v a -> Array v' b
unsafeModifyVector v a -> v' b
f (UnsafeArray Vector Int
s Vector Int
_ v a
v) = Vector Int -> v' b -> Array v' b
forall {k} (v :: k -> *) (a :: k). Vector Int -> v a -> Array v a
unsafeArray Vector Int
s (v a -> v' b
f v a
v)
type Dim = Int
type Dims = [Int]
shape :: Array v a -> VU.Vector Int
shape :: forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape (UnsafeArray Vector Int
s Vector Int
_ v a
_) = Vector Int
s
rank :: Array v a -> Int
rank :: forall {k} (v :: k -> *) (a :: k). Array v a -> Int
rank = Vector Int -> Int
S.rank (Vector Int -> Int)
-> (Array v a -> Vector Int) -> Array v a -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape
size :: Array v a -> Int
size :: forall {k} (v :: k -> *) (a :: k). Array v a -> Int
size = Vector Int -> Int
S.size (Vector Int -> Int)
-> (Array v a -> Vector Int) -> Array v a -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape
length :: Array v a -> Int
length :: forall {k} (v :: k -> *) (a :: k). Array v a -> Int
length Array v a
a = Int -> Int -> Bool -> Int
forall a. a -> a -> Bool -> a
bool (Vector Int -> Int
forall a. Unbox a => Vector a -> a
VU.head (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a)) Int
1 (Vector Int -> Bool
forall a. Unbox a => Vector a -> Bool
VU.null (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a))
isNull :: Array v a -> Bool
isNull :: forall {k} (v :: k -> *) (a :: k). Array v a -> Bool
isNull = (Int
0 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==) (Int -> Bool) -> (Array v a -> Int) -> Array v a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array v a -> Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Int
size
indexV :: (VG.Vector v a) => Array v a -> VU.Vector Int -> a
indexV :: forall (v :: * -> *) a. Vector v a => Array v a -> Vector Int -> a
indexV (UnsafeArray Vector Int
_ Vector Int
strides v a
v) Vector Int
i = v a -> Int -> a
forall (v :: * -> *) a. Vector v a => v a -> Int -> a
VG.unsafeIndex v a
v (Vector Int -> Vector Int -> Int
S.flattenStrides Vector Int
strides Vector Int
i)
{-# NOINLINE indexV #-}
index :: (VG.Vector v a) => Array v a -> [Int] -> a
index :: forall (v :: * -> *) a. Vector v a => Array v a -> [Int] -> a
index Array v a
a = Array v a -> Vector Int -> a
forall (v :: * -> *) a. Vector v a => Array v a -> Vector Int -> a
indexV Array v a
a (Vector Int -> a) -> ([Int] -> Vector Int) -> [Int] -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList
{-# INLINE index #-}
infixl 9 !
(!) :: (VG.Vector v a) => Array v a -> [Int] -> a
! :: forall (v :: * -> *) a. Vector v a => Array v a -> [Int] -> a
(!) = Array v a -> [Int] -> a
forall (v :: * -> *) a. Vector v a => Array v a -> [Int] -> a
index
(!?) :: (VG.Vector v a) => Array v a -> [Int] -> Maybe a
!? :: forall (v :: * -> *) a. Vector v a => Array v a -> [Int] -> Maybe a
(!?) Array v a
a [Int]
xs = Maybe a -> Maybe a -> Bool -> Maybe a
forall a. a -> a -> Bool -> a
bool Maybe a
forall a. Maybe a
Nothing (a -> Maybe a
forall a. a -> Maybe a
Just (Array v a
a Array v a -> [Int] -> a
forall (v :: * -> *) a. Vector v a => Array v a -> [Int] -> a
! [Int]
xs)) ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
xs Vector Int -> Vector Int -> Bool
`S.isFins` Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a)
tabulateV :: (VG.Vector v a) => VU.Vector Int -> (VU.Vector Int -> a) -> Array v a
tabulateV :: forall (v :: * -> *) a.
Vector v a =>
Vector Int -> (Vector Int -> a) -> Array v a
tabulateV Vector Int
ds Vector Int -> a
f =
let strs :: Vector Int
strs = Vector Int -> Vector Int
S.stridesOf Vector Int
ds
in Vector Int -> Vector Int -> v a -> Array v a
forall {k} (v :: k -> *) (a :: k).
Vector Int -> Vector Int -> v a -> Array v a
UnsafeArray Vector Int
ds Vector Int
strs (Int -> (Int -> a) -> v a
forall (v :: * -> *) a. Vector v a => Int -> (Int -> a) -> v a
VG.generate (Vector Int -> Int
S.size Vector Int
ds) (Vector Int -> a
f (Vector Int -> a) -> (Int -> Vector Int) -> Int -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector Int -> Int -> Vector Int
S.shapenStrides Vector Int
strs))
tabulate :: (VG.Vector v a) => [Int] -> ([Int] -> a) -> Array v a
tabulate :: forall (v :: * -> *) a.
Vector v a =>
[Int] -> ([Int] -> a) -> Array v a
tabulate [Int]
ds [Int] -> a
f = Vector Int -> (Vector Int -> a) -> Array v a
forall (v :: * -> *) a.
Vector v a =>
Vector Int -> (Vector Int -> a) -> Array v a
tabulateV ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
ds) ([Int] -> a
f ([Int] -> a) -> (Vector Int -> [Int]) -> Vector Int -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList)
backpermute :: (VG.Vector v a) => (VU.Vector Int -> VU.Vector Int) -> (VU.Vector Int -> VU.Vector Int) -> Array v a -> Array v a
backpermute :: forall (v :: * -> *) a.
Vector v a =>
(Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
backpermute Vector Int -> Vector Int
f Vector Int -> Vector Int
g Array v a
a = Vector Int -> (Vector Int -> a) -> Array v a
forall (v :: * -> *) a.
Vector v a =>
Vector Int -> (Vector Int -> a) -> Array v a
tabulateV (Vector Int -> Vector Int
f (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a)) (Array v a -> Vector Int -> a
forall (v :: * -> *) a. Vector v a => Array v a -> Vector Int -> a
indexV Array v a
a (Vector Int -> a) -> (Vector Int -> Vector Int) -> Vector Int -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector Int -> Vector Int
g)
{-# INLINEABLE backpermute #-}
fromScalar :: (VG.Vector v a) => Array v a -> a
fromScalar :: forall (v :: * -> *) a. Vector v a => Array v a -> a
fromScalar Array v a
a = Array v a -> [Int] -> a
forall (v :: * -> *) a. Vector v a => Array v a -> [Int] -> a
index Array v a
a ([] :: [Int])
toScalar :: (VG.Vector v a) => a -> Array v a
toScalar :: forall (v :: * -> *) a. Vector v a => a -> Array v a
toScalar a
a = [Int] -> ([Int] -> a) -> Array v a
forall (v :: * -> *) a.
Vector v a =>
[Int] -> ([Int] -> a) -> Array v a
tabulate [] (a -> [Int] -> a
forall a b. a -> b -> a
const a
a)
isScalar :: Array v a -> Bool
isScalar :: forall {k} (v :: k -> *) (a :: k). Array v a -> Bool
isScalar Array v a
a = Array v a -> Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Int
rank Array v a
a Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0
asSingleton :: Array v a -> Array v a
asSingleton :: forall {k} (v :: k -> *) (a :: k). Array v a -> Array v a
asSingleton = (Vector Int -> Vector Int) -> Array v a -> Array v a
forall {k} (v :: k -> *) (a :: k).
(Vector Int -> Vector Int) -> Array v a -> Array v a
unsafeModifyShape Vector Int -> Vector Int
S.asSingleton
asScalar :: Array v a -> Array v a
asScalar :: forall {k} (v :: k -> *) (a :: k). Array v a -> Array v a
asScalar = (Vector Int -> Vector Int) -> Array v a -> Array v a
forall {k} (v :: k -> *) (a :: k).
(Vector Int -> Vector Int) -> Array v a -> Array v a
unsafeModifyShape Vector Int -> Vector Int
S.asScalar
empty :: (VG.Vector v a) => Array v a
empty :: forall (v :: * -> *) a. Vector v a => Array v a
empty = [Int] -> [a] -> Array v a
forall (v :: * -> *) a. Vector v a => [Int] -> [a] -> Array v a
array [Int
0] []
range :: (VG.Vector v Int) => [Int] -> Array v Int
range :: forall (v :: * -> *). Vector v Int => [Int] -> Array v Int
range [Int]
xs = [Int] -> ([Int] -> Int) -> Array v Int
forall (v :: * -> *) a.
Vector v a =>
[Int] -> ([Int] -> a) -> Array v a
tabulate [Int]
xs (Vector Int -> Vector Int -> Int
S.flatten ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
xs) (Vector Int -> Int) -> ([Int] -> Vector Int) -> [Int] -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList)
corange :: (VG.Vector v Int) => [Int] -> Array v Int
corange :: forall (v :: * -> *). Vector v Int => [Int] -> Array v Int
corange [Int]
xs = [Int] -> ([Int] -> Int) -> Array v Int
forall (v :: * -> *) a.
Vector v a =>
[Int] -> ([Int] -> a) -> Array v a
tabulate [Int]
xs (Vector Int -> Vector Int -> Int
S.flatten ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList ([Int] -> [Int]
forall a. [a] -> [a]
List.reverse [Int]
xs)) (Vector Int -> Int) -> ([Int] -> Vector Int) -> [Int] -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList ([Int] -> Vector Int) -> ([Int] -> [Int]) -> [Int] -> Vector Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int] -> [Int]
forall a. [a] -> [a]
List.reverse)
indices :: (VG.Vector v [Int]) => [Int] -> Array v [Int]
indices :: forall (v :: * -> *). Vector v [Int] => [Int] -> Array v [Int]
indices [Int]
ds = [Int] -> ([Int] -> [Int]) -> Array v [Int]
forall (v :: * -> *) a.
Vector v a =>
[Int] -> ([Int] -> a) -> Array v a
tabulate [Int]
ds [Int] -> [Int]
forall a. a -> a
id
ident :: (Add.Additive a, Mult.Multiplicative a, VG.Vector v a) => [Int] -> Array v a
ident :: forall a (v :: * -> *).
(Additive a, Multiplicative a, Vector v a) =>
[Int] -> Array v a
ident [Int]
ds = [Int] -> ([Int] -> a) -> Array v a
forall (v :: * -> *) a.
Vector v a =>
[Int] -> ([Int] -> a) -> Array v a
tabulate [Int]
ds (a -> a -> Bool -> a
forall a. a -> a -> Bool -> a
bool a
forall a. Additive a => a
Add.zero a
forall a. Multiplicative a => a
Mult.one (Bool -> a) -> ([Int] -> Bool) -> [Int] -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector Int -> Bool
isDiag (Vector Int -> Bool) -> ([Int] -> Vector Int) -> [Int] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList)
konst :: (VG.Vector v a) => [Int] -> a -> Array v a
konst :: forall (v :: * -> *) a. Vector v a => [Int] -> a -> Array v a
konst [Int]
ds a
a = [Int] -> ([Int] -> a) -> Array v a
forall (v :: * -> *) a.
Vector v a =>
[Int] -> ([Int] -> a) -> Array v a
tabulate [Int]
ds (a -> [Int] -> a
forall a b. a -> b -> a
const a
a)
singleton :: (VG.Vector v a) => a -> Array v a
singleton :: forall (v :: * -> *) a. Vector v a => a -> Array v a
singleton a
a = [Int] -> v a -> Array v a
forall {k} (v :: k -> *) (a :: k). [Int] -> v a -> Array v a
unsafeArrayL [Int
1] (a -> v a
forall (v :: * -> *) a. Vector v a => a -> v a
VG.singleton a
a)
diag ::
(VG.Vector v a) =>
Array v a ->
Array v a
diag :: forall (v :: * -> *) a. Vector v a => Array v a -> Array v a
diag Array v a
a = (Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
(Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
backpermute Vector Int -> Vector Int
S.minDim (Int -> Int -> Vector Int
forall a. Unbox a => Int -> a -> Vector a
VU.replicate (Array v a -> Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Int
rank Array v a
a) (Int -> Vector Int)
-> (Vector Int -> Int) -> Vector Int -> Vector Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Vector Int -> Int
S.getDim Int
0) Array v a
a
undiag ::
(VG.Vector v a) =>
(Add.Additive a) =>
Array v a ->
Array v a
undiag :: forall (v :: * -> *) a.
(Vector v a, Additive a) =>
Array v a -> Array v a
undiag Array v a
a = [Int] -> ([Int] -> a) -> Array v a
forall (v :: * -> *) a.
Vector v a =>
[Int] -> ([Int] -> a) -> Array v a
tabulate (Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a Vector Int -> Vector Int -> Vector Int
forall a. Unbox a => Vector a -> Vector a -> Vector a
VU.++ Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a)) (\[Int]
xs -> a -> a -> Bool -> a
forall a. a -> a -> Bool -> a
bool a
forall a. Additive a => a
Add.zero (Array v a -> [Int] -> a
forall (v :: * -> *) a. Vector v a => Array v a -> [Int] -> a
index Array v a
a (Int -> [Int] -> [Int]
forall a. Int -> [a] -> [a]
List.take (Array v a -> Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Int
rank Array v a
a) [Int]
xs)) (Vector Int -> Bool
isDiag ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
xs)))
zipWith :: (VG.Vector v a, VG.Vector v b, VG.Vector v c) => (a -> b -> c) -> Array v a -> Array v b -> Array v c
zipWith :: forall (v :: * -> *) a b c.
(Vector v a, Vector v b, Vector v c) =>
(a -> b -> c) -> Array v a -> Array v b -> Array v c
zipWith a -> b -> c
f (UnsafeArray Vector Int
s Vector Int
_ v a
v) (UnsafeArray Vector Int
_ Vector Int
_ v b
v') = Vector Int -> v c -> Array v c
forall {k} (v :: k -> *) (a :: k). Vector Int -> v a -> Array v a
unsafeArray Vector Int
s ((a -> b -> c) -> v a -> v b -> v c
forall (v :: * -> *) a b c.
(Vector v a, Vector v b, Vector v c) =>
(a -> b -> c) -> v a -> v b -> v c
VG.zipWith a -> b -> c
f v a
v v b
v')
zipWithSafe :: (VG.Vector v a, VG.Vector v b, VG.Vector v c) => (a -> b -> c) -> Array v a -> Array v b -> Maybe (Array v c)
zipWithSafe :: forall (v :: * -> *) a b c.
(Vector v a, Vector v b, Vector v c) =>
(a -> b -> c) -> Array v a -> Array v b -> Maybe (Array v c)
zipWithSafe a -> b -> c
f (UnsafeArray Vector Int
s Vector Int
_ v a
v) (UnsafeArray Vector Int
s' Vector Int
_ v b
v') = Maybe (Array v c) -> Maybe (Array v c) -> Bool -> Maybe (Array v c)
forall a. a -> a -> Bool -> a
bool Maybe (Array v c)
forall a. Maybe a
Nothing (Array v c -> Maybe (Array v c)
forall a. a -> Maybe a
Just (Array v c -> Maybe (Array v c)) -> Array v c -> Maybe (Array v c)
forall a b. (a -> b) -> a -> b
$ Vector Int -> v c -> Array v c
forall {k} (v :: k -> *) (a :: k). Vector Int -> v a -> Array v a
unsafeArray Vector Int
s ((a -> b -> c) -> v a -> v b -> v c
forall (v :: * -> *) a b c.
(Vector v a, Vector v b, Vector v c) =>
(a -> b -> c) -> v a -> v b -> v c
VG.zipWith a -> b -> c
f v a
v v b
v')) (Vector Int
s Vector Int -> Vector Int -> Bool
forall a. Eq a => a -> a -> Bool
== Vector Int
s')
modify :: (VG.Vector v a) => [Int] -> (a -> a) -> Array v a -> Array v a
modify :: forall (v :: * -> *) a.
Vector v a =>
[Int] -> (a -> a) -> Array v a -> Array v a
modify [Int]
ds a -> a
f Array v a
a = [Int] -> ([Int] -> a) -> Array v a
forall (v :: * -> *) a.
Vector v a =>
[Int] -> ([Int] -> a) -> Array v a
tabulate (Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a)) (\[Int]
s -> (a -> a) -> (a -> a) -> Bool -> a -> a
forall a. a -> a -> Bool -> a
bool a -> a
forall a. a -> a
id a -> a
f ([Int]
s [Int] -> [Int] -> Bool
forall a. Eq a => a -> a -> Bool
== [Int]
ds) (Array v a -> [Int] -> a
forall (v :: * -> *) a. Vector v a => Array v a -> [Int] -> a
index Array v a
a [Int]
s))
imap ::
(VG.Vector v a, VG.Vector v b, VG.Vector v [Int]) =>
([Int] -> a -> b) ->
Array v a ->
Array v b
imap :: forall (v :: * -> *) a b.
(Vector v a, Vector v b, Vector v [Int]) =>
([Int] -> a -> b) -> Array v a -> Array v b
imap [Int] -> a -> b
f Array v a
a = ([Int] -> a -> b) -> Array v [Int] -> Array v a -> Array v b
forall (v :: * -> *) a b c.
(Vector v a, Vector v b, Vector v c) =>
(a -> b -> c) -> Array v a -> Array v b -> Array v c
zipWith [Int] -> a -> b
f ([Int] -> Array v [Int]
forall (v :: * -> *). Vector v [Int] => [Int] -> Array v [Int]
indices (Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a))) Array v a
a
rowWise :: (Dims -> [x] -> Array v a -> Array v a) -> [x] -> Array v a -> Array v a
rowWise :: forall {k} x (v :: k -> *) (a :: k).
([Int] -> [x] -> Array v a -> Array v a)
-> [x] -> Array v a -> Array v a
rowWise [Int] -> [x] -> Array v a -> Array v a
f [x]
xs Array v a
a = [Int] -> [x] -> Array v a -> Array v a
f [Int
0 .. ([x] -> Int
forall a. [a] -> Int
S.rankL [x]
xs Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)] [x]
xs Array v a
a
colWise :: (Dims -> [x] -> Array v a -> Array v a) -> [x] -> Array v a -> Array v a
colWise :: forall {k} x (v :: k -> *) (a :: k).
([Int] -> [x] -> Array v a -> Array v a)
-> [x] -> Array v a -> Array v a
colWise [Int] -> [x] -> Array v a -> Array v a
f [x]
xs Array v a
a = [Int] -> [x] -> Array v a -> Array v a
f ([Int] -> [Int]
forall a. [a] -> [a]
List.reverse [(Array v a -> Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Int
rank Array v a
a Int -> Int -> Int
forall a. Num a => a -> a -> a
- [x] -> Int
forall a. [a] -> Int
S.rankL [x]
xs) .. (Array v a -> Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Int
rank Array v a
a Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)]) [x]
xs Array v a
a
dimsWise :: (Dim -> x -> Array v a -> Array v a) -> Dims -> [x] -> Array v a -> Array v a
dimsWise :: forall {k} x (v :: k -> *) (a :: k).
(Int -> x -> Array v a -> Array v a)
-> [Int] -> [x] -> Array v a -> Array v a
dimsWise Int -> x -> Array v a -> Array v a
f [Int]
ds [x]
xs Array v a
a = (Array v a -> (Int, x) -> Array v a)
-> Array v a -> [(Int, x)] -> Array v a
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\Array v a
a' (Int
d, x
x) -> Int -> x -> Array v a -> Array v a
f Int
d x
x Array v a
a') Array v a
a ([Int] -> [x] -> [(Int, x)]
forall a b. [a] -> [b] -> [(a, b)]
List.zip [Int]
ds [x]
xs)
take ::
(VG.Vector v a) =>
Dim ->
Int ->
Array v a ->
Array v a
take :: forall (v :: * -> *) a.
Vector v a =>
Int -> Int -> Array v a -> Array v a
take Int
d Int
t Array v a
a = (Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
(Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
backpermute Vector Int -> Vector Int
dsNew (Int -> (Int -> Int) -> Vector Int -> Vector Int
modifyDim Int
d (\Int
x -> Int
x Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int -> Int -> Bool -> Int
forall a. a -> a -> Bool -> a
bool Int
0 (Int -> Vector Int -> Int
getDim Int
d (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
t) (Int
t Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0))) Array v a
a
where
dsNew :: Vector Int -> Vector Int
dsNew = Int -> Int -> Vector Int -> Vector Int
takeDim Int
d (Int -> Int
forall a. Num a => a -> a
abs Int
t)
drop ::
(VG.Vector v a) =>
Dim ->
Int ->
Array v a ->
Array v a
drop :: forall (v :: * -> *) a.
Vector v a =>
Int -> Int -> Array v a -> Array v a
drop Int
d Int
t Array v a
a = (Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
(Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
backpermute Vector Int -> Vector Int
dsNew (Int -> (Int -> Int) -> Vector Int -> Vector Int
modifyDim Int
d (\Int
x -> Int
x Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int -> Int -> Bool -> Int
forall a. a -> a -> Bool -> a
bool Int
t Int
0 (Int
t Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0))) Array v a
a
where
dsNew :: Vector Int -> Vector Int
dsNew = Int -> Int -> Vector Int -> Vector Int
dropDim Int
d (Int -> Int
forall a. Num a => a -> a
abs Int
t)
select ::
(VG.Vector v a) =>
Dim ->
Int ->
Array v a ->
Array v a
select :: forall (v :: * -> *) a.
Vector v a =>
Int -> Int -> Array v a -> Array v a
select Int
d Int
x Array v a
a = (Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
(Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
backpermute (Int -> Vector Int -> Vector Int
deleteDim Int
d) (Int -> Int -> Vector Int -> Vector Int
insertDim Int
d Int
x) Array v a
a
insert ::
(VG.Vector v a) =>
Dim ->
Int ->
Array v a ->
Array v a ->
Array v a
insert :: forall (v :: * -> *) a.
Vector v a =>
Int -> Int -> Array v a -> Array v a -> Array v a
insert Int
d Int
i Array v a
a Array v a
b = [Int] -> ([Int] -> a) -> Array v a
forall (v :: * -> *) a.
Vector v a =>
[Int] -> ([Int] -> a) -> Array v a
tabulate (Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Int -> Vector Int -> Vector Int
S.incAt Int
d (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a))) [Int] -> a
go
where
go :: [Int] -> a
go [Int]
s =
let s' :: Vector Int
s' = [Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
s
in case Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Int -> Vector Int -> Int
S.getDim Int
d Vector Int
s') Int
i of
Ordering
EQ -> Array v a -> [Int] -> a
forall (v :: * -> *) a. Vector v a => Array v a -> [Int] -> a
index Array v a
b (Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Int -> Vector Int -> Vector Int
S.deleteDim Int
d Vector Int
s'))
Ordering
LT -> Array v a -> [Int] -> a
forall (v :: * -> *) a. Vector v a => Array v a -> [Int] -> a
index Array v a
a [Int]
s
Ordering
GT -> Array v a -> [Int] -> a
forall (v :: * -> *) a. Vector v a => Array v a -> [Int] -> a
index Array v a
a (Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Int -> Vector Int -> Vector Int
S.decAt Int
d Vector Int
s'))
delete ::
(VG.Vector v a) =>
Dim ->
Int ->
Array v a ->
Array v a
delete :: forall (v :: * -> *) a.
Vector v a =>
Int -> Int -> Array v a -> Array v a
delete Int
d Int
i Array v a
a = (Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
(Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
backpermute (Int -> Vector Int -> Vector Int
decAt Int
d) (\Vector Int
s -> Vector Int -> Vector Int -> Bool -> Vector Int
forall a. a -> a -> Bool -> a
bool (Int -> Vector Int -> Vector Int
incAt Int
d Vector Int
s) Vector Int
s (Int -> Vector Int -> Int
getDim Int
d Vector Int
s Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
i)) Array v a
a
append ::
(VG.Vector v a) =>
Dim ->
Array v a ->
Array v a ->
Array v a
append :: forall (v :: * -> *) a.
Vector v a =>
Int -> Array v a -> Array v a -> Array v a
append Int
d Array v a
a Array v a
b = Int -> Int -> Array v a -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
Int -> Int -> Array v a -> Array v a -> Array v a
insert Int
d (Int -> Vector Int -> Int
getDim Int
d (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a)) Array v a
a Array v a
b
prepend ::
(VG.Vector v a) =>
Dim ->
Array v a ->
Array v a ->
Array v a
prepend :: forall (v :: * -> *) a.
Vector v a =>
Int -> Array v a -> Array v a -> Array v a
prepend Int
d Array v a
a Array v a
b = Int -> Int -> Array v a -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
Int -> Int -> Array v a -> Array v a -> Array v a
insert Int
d Int
0 Array v a
b Array v a
a
concatenate ::
(VG.Vector v a) =>
Dim ->
Array v a ->
Array v a ->
Array v a
concatenate :: forall (v :: * -> *) a.
Vector v a =>
Int -> Array v a -> Array v a -> Array v a
concatenate Int
d Array v a
a0 Array v a
a1 = [Int] -> ([Int] -> a) -> Array v a
forall (v :: * -> *) a.
Vector v a =>
[Int] -> ([Int] -> a) -> Array v a
tabulate (Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Int -> Vector Int -> Vector Int -> Vector Int
S.concatenate Int
d (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a0) (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a1))) [Int] -> a
go
where
go :: [Int] -> a
go [Int]
s =
let s' :: Vector Int
s' = [Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
s
in a -> a -> Bool -> a
forall a. a -> a -> Bool -> a
bool
(Array v a -> [Int] -> a
forall (v :: * -> *) a. Vector v a => Array v a -> [Int] -> a
index Array v a
a0 [Int]
s)
( Array v a -> [Int] -> a
forall (v :: * -> *) a. Vector v a => Array v a -> [Int] -> a
index
Array v a
a1
( Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList
( Int -> Int -> Vector Int -> Vector Int
S.insertDim
Int
d
(Int -> Vector Int -> Int
S.getDim Int
d Vector Int
s' Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int -> Vector Int -> Int
S.getDim Int
d Vector Int
ds0)
(Int -> Vector Int -> Vector Int
S.deleteDim Int
d Vector Int
s')
)
)
)
(Int -> Vector Int -> Int
S.getDim Int
d Vector Int
s' Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int -> Vector Int -> Int
S.getDim Int
d Vector Int
ds0)
ds0 :: Vector Int
ds0 = Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a0
couple :: (VG.Vector v a) => Int -> Array v a -> Array v a -> Array v a
couple :: forall (v :: * -> *) a.
Vector v a =>
Int -> Array v a -> Array v a -> Array v a
couple Int
d Array v a
a Array v a
a' = Int -> Array v a -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
Int -> Array v a -> Array v a -> Array v a
concatenate Int
d (Int -> Array v a -> Array v a
forall {k} (v :: k -> *) (a :: k). Int -> Array v a -> Array v a
elongate Int
d Array v a
a) (Int -> Array v a -> Array v a
forall {k} (v :: k -> *) (a :: k). Int -> Array v a -> Array v a
elongate Int
d Array v a
a')
slice ::
(VG.Vector v a) =>
Dim ->
Int ->
Int ->
Array v a ->
Array v a
slice :: forall (v :: * -> *) a.
Vector v a =>
Int -> Int -> Int -> Array v a -> Array v a
slice Int
d Int
o Int
l Array v a
a = (Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
(Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
backpermute (Int -> Int -> Vector Int -> Vector Int
setDim Int
d Int
l) (Int -> (Int -> Int) -> Vector Int -> Vector Int
modifyDim Int
d (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
o)) Array v a
a
rotate ::
(VG.Vector v a) =>
Dim ->
Int ->
Array v a ->
Array v a
rotate :: forall (v :: * -> *) a.
Vector v a =>
Int -> Int -> Array v a -> Array v a
rotate Int
d Int
r Array v a
a = (Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
(Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
backpermute Vector Int -> Vector Int
forall a. a -> a
id (Int -> Int -> Vector Int -> Vector Int -> Vector Int
rotateIndex Int
d Int
r (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a)) Array v a
a
takes ::
(VG.Vector v a) =>
Dims ->
[Int] ->
Array v a ->
Array v a
takes :: forall (v :: * -> *) a.
Vector v a =>
[Int] -> [Int] -> Array v a -> Array v a
takes [Int]
ds [Int]
xs Array v a
a = (Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
(Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
backpermute (Vector Int -> Vector Int -> Vector Int
forall a b. a -> b -> a
const Vector Int
dsNew) ((Int -> Int -> Int) -> Vector Int -> Vector Int -> Vector Int
forall a b c.
(Unbox a, Unbox b, Unbox c) =>
(a -> b -> c) -> Vector a -> Vector b -> Vector c
VU.zipWith Int -> Int -> Int
forall a. Num a => a -> a -> a
(+) Vector Int
start) Array v a
a
where
dsNew :: Vector Int
dsNew = Vector Int -> Vector Int -> Vector Int -> Vector Int
S.setDims ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
ds) ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
xsAbs) (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a)
start :: Vector Int
start = (Int -> Int -> Int) -> Vector Int -> Vector Int -> Vector Int
forall a b c.
(Unbox a, Unbox b, Unbox c) =>
(a -> b -> c) -> Vector a -> Vector b -> Vector c
VU.zipWith (\Int
x Int
s -> Int -> Int -> Bool -> Int
forall a. a -> a -> Bool -> a
bool Int
0 (Int
s Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
x) (Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0)) (Vector Int -> Vector Int -> Vector Int -> Vector Int
S.setDims ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
ds) ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
xs) (Int -> Int -> Vector Int
forall a. Unbox a => Int -> a -> Vector a
VU.replicate (Array v a -> Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Int
rank Array v a
a) Int
0)) (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a)
xsAbs :: [Int]
xsAbs = (Int -> Int) -> [Int] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Int -> Int
forall a. Num a => a -> a
abs [Int]
xs
drops ::
(VG.Vector v a) =>
Dims ->
[Int] ->
Array v a ->
Array v a
drops :: forall (v :: * -> *) a.
Vector v a =>
[Int] -> [Int] -> Array v a -> Array v a
drops [Int]
ds [Int]
xs Array v a
a = (Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
(Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
backpermute (Vector Int -> Vector Int -> Vector Int
forall a b. a -> b -> a
const Vector Int
dsNew) ((Int -> Int -> Int) -> Vector Int -> Vector Int -> Vector Int
forall a b c.
(Unbox a, Unbox b, Unbox c) =>
(a -> b -> c) -> Vector a -> Vector b -> Vector c
VU.zipWith (\Int
d' Int
s' -> Int -> Int -> Bool -> Int
forall a. a -> a -> Bool -> a
bool (Int
d' Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
s') Int
s' (Int
d' Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0)) Vector Int
xsNew) Array v a
a
where
dsNew :: Vector Int
dsNew = Vector Int -> Vector Int -> Vector Int -> Vector Int
S.dropDims ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
ds) ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
xsAbs) (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a)
xsNew :: Vector Int
xsNew = Vector Int -> Vector Int -> Vector Int -> Vector Int
S.setDims ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
ds) ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
xs) (Int -> Int -> Vector Int
forall a. Unbox a => Int -> a -> Vector a
VU.replicate (Array v a -> Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Int
rank Array v a
a) Int
0)
xsAbs :: [Int]
xsAbs = (Int -> Int) -> [Int] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Int -> Int
forall a. Num a => a -> a
abs [Int]
xs
indexes :: (VG.Vector v a) => Dims -> [Int] -> Array v a -> Array v a
indexes :: forall (v :: * -> *) a.
Vector v a =>
[Int] -> [Int] -> Array v a -> Array v a
indexes [Int]
ds [Int]
xs Array v a
a = (Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
(Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
backpermute (Vector Int -> Vector Int -> Vector Int
forall a b. a -> b -> a
const (Vector Int -> Vector Int -> Vector Int
S.deleteDims ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
ds) (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a))) (Vector Int -> Vector Int -> Vector Int -> Vector Int
S.insertDims ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
ds) ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
xs)) Array v a
a
slices :: (VG.Vector v a) => Dims -> [Int] -> [Int] -> Array v a -> Array v a
slices :: forall (v :: * -> *) a.
Vector v a =>
[Int] -> [Int] -> [Int] -> Array v a -> Array v a
slices [Int]
ds [Int]
os [Int]
ls Array v a
a = (Int -> (Int, Int) -> Array v a -> Array v a)
-> [Int] -> [(Int, Int)] -> Array v a -> Array v a
forall {k} x (v :: k -> *) (a :: k).
(Int -> x -> Array v a -> Array v a)
-> [Int] -> [x] -> Array v a -> Array v a
dimsWise (\Int
d (Int
o, Int
l) -> Int -> Int -> Int -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
Int -> Int -> Int -> Array v a -> Array v a
slice Int
d Int
o Int
l) [Int]
ds ([Int] -> [Int] -> [(Int, Int)]
forall a b. [a] -> [b] -> [(a, b)]
List.zip [Int]
os [Int]
ls) Array v a
a
heads :: (VG.Vector v a) => Dims -> Array v a -> Array v a
heads :: forall (v :: * -> *) a.
Vector v a =>
[Int] -> Array v a -> Array v a
heads [Int]
ds Array v a
a = [Int] -> [Int] -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
[Int] -> [Int] -> Array v a -> Array v a
indexes [Int]
ds (Int -> Int -> [Int]
forall a. Int -> a -> [a]
List.replicate ([Int] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
List.length [Int]
ds) Int
0) Array v a
a
lasts :: (VG.Vector v a) => Dims -> Array v a -> Array v a
lasts :: forall (v :: * -> *) a.
Vector v a =>
[Int] -> Array v a -> Array v a
lasts [Int]
ds Array v a
a = [Int] -> [Int] -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
[Int] -> [Int] -> Array v a -> Array v a
indexes [Int]
ds [Int]
lastds Array v a
a
where
lastds :: [Int]
lastds = (\Int
i -> Int -> Vector Int -> Int
S.getDim Int
i (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a) Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) (Int -> Int) -> [Int] -> [Int]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Int]
ds
tails :: (VG.Vector v a) => Dims -> Array v a -> Array v a
tails :: forall (v :: * -> *) a.
Vector v a =>
[Int] -> Array v a -> Array v a
tails [Int]
ds Array v a
a = [Int] -> [Int] -> [Int] -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
[Int] -> [Int] -> [Int] -> Array v a -> Array v a
slices [Int]
ds [Int]
os (Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList Vector Int
ls) Array v a
a
where
os :: [Int]
os = Int -> Int -> [Int]
forall a. Int -> a -> [a]
List.replicate ([Int] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
List.length [Int]
ds) Int
1
ls :: Vector Int
ls = Vector Int -> Vector Int -> Vector Int
S.getLastPositions ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
ds) (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a)
inits :: (VG.Vector v a) => Dims -> Array v a -> Array v a
inits :: forall (v :: * -> *) a.
Vector v a =>
[Int] -> Array v a -> Array v a
inits [Int]
ds Array v a
a = [Int] -> [Int] -> [Int] -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
[Int] -> [Int] -> [Int] -> Array v a -> Array v a
slices [Int]
ds [Int]
os (Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList Vector Int
ls) Array v a
a
where
os :: [Int]
os = Int -> Int -> [Int]
forall a. Int -> a -> [a]
List.replicate ([Int] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
List.length [Int]
ds) Int
0
ls :: Vector Int
ls = Vector Int -> Vector Int -> Vector Int
S.getLastPositions ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
ds) (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a)
extracts ::
(VG.Vector v (Array v a), VG.Vector v a) =>
Dims ->
Array v a ->
Array v (Array v a)
[Int]
ds Array v a
a = [Int] -> ([Int] -> Array v a) -> Array v (Array v a)
forall (v :: * -> *) a.
Vector v a =>
[Int] -> ([Int] -> a) -> Array v a
tabulate (Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Vector Int -> Vector Int -> Vector Int
S.getDims ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
ds) (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a))) [Int] -> Array v a
go
where
go :: [Int] -> Array v a
go [Int]
s = [Int] -> [Int] -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
[Int] -> [Int] -> Array v a -> Array v a
indexes [Int]
ds [Int]
s Array v a
a
reduces ::
(VG.Vector v a, VG.Vector v b, VG.Vector v (Array v a)) =>
Dims ->
(Array v a -> b) ->
Array v a ->
Array v b
reduces :: forall (v :: * -> *) a b.
(Vector v a, Vector v b, Vector v (Array v a)) =>
[Int] -> (Array v a -> b) -> Array v a -> Array v b
reduces [Int]
ds Array v a -> b
f Array v a
a = (Array v a -> b) -> Array v (Array v a) -> Array v b
forall (v :: * -> *) a b.
(Vector v a, Vector v b) =>
(a -> b) -> Array v a -> Array v b
fmapA Array v a -> b
f ([Int] -> Array v a -> Array v (Array v a)
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v a -> Array v (Array v a)
extracts [Int]
ds Array v a
a)
joins ::
(VG.Vector v (Array v a), VG.Vector v a) =>
Dims ->
Array v (Array v a) ->
Array v a
joins :: forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v (Array v a) -> Array v a
joins [Int]
ds Array v (Array v a)
a = [Int] -> ([Int] -> a) -> Array v a
forall (v :: * -> *) a.
Vector v a =>
[Int] -> ([Int] -> a) -> Array v a
tabulate (Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Vector Int -> Vector Int -> Vector Int -> Vector Int
S.insertDims ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
ds) Vector Int
so Vector Int
si)) [Int] -> a
go
where
go :: [Int] -> a
go [Int]
s = Array v a -> [Int] -> a
forall (v :: * -> *) a. Vector v a => Array v a -> [Int] -> a
index (Array v (Array v a) -> [Int] -> Array v a
forall (v :: * -> *) a. Vector v a => Array v a -> [Int] -> a
index Array v (Array v a)
a (Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Vector Int -> Vector Int -> Vector Int
S.getDims ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
ds) ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
s)))) (Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Vector Int -> Vector Int -> Vector Int
S.deleteDims ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
ds) ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
s)))
so :: Vector Int
so = Array v (Array v a) -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v (Array v a)
a
si :: Vector Int
si = Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape (Array v (Array v a) -> [Int] -> Array v a
forall (v :: * -> *) a. Vector v a => Array v a -> [Int] -> a
index Array v (Array v a)
a (Int -> Int -> [Int]
forall a. Int -> a -> [a]
replicate (Array v (Array v a) -> Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Int
rank Array v (Array v a)
a) Int
0))
joinsSafe ::
(VG.Vector v (Array v a), VG.Vector v a, VG.Vector v (VU.Vector Int)) =>
Dims ->
Array v (Array v a) ->
Maybe (Array v a)
joinsSafe :: forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a, Vector v (Vector Int)) =>
[Int] -> Array v (Array v a) -> Maybe (Array v a)
joinsSafe [Int]
ds Array v (Array v a)
a =
Maybe (Array v a) -> Maybe (Array v a) -> Bool -> Maybe (Array v a)
forall a. a -> a -> Bool -> a
bool
Maybe (Array v a)
forall a. Maybe a
Nothing
(Array v a -> Maybe (Array v a)
forall a. a -> Maybe a
Just (Array v a -> Maybe (Array v a)) -> Array v a -> Maybe (Array v a)
forall a b. (a -> b) -> a -> b
$ [Int] -> Array v (Array v a) -> Array v a
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v (Array v a) -> Array v a
joins [Int]
ds Array v (Array v a)
a)
(Array v (Vector Int) -> Bool
forall a (v :: * -> *). (Eq a, Vector v a) => Array v a -> Bool
allEqual ((Array v a -> Vector Int)
-> Array v (Array v a) -> Array v (Vector Int)
forall (v :: * -> *) a b.
(Vector v a, Vector v b) =>
(a -> b) -> Array v a -> Array v b
fmapA Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v (Array v a)
a))
join ::
(VG.Vector v (Array v a), VG.Vector v a) =>
Array v (Array v a) ->
Array v a
join :: forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
Array v (Array v a) -> Array v a
join Array v (Array v a)
a = [Int] -> Array v (Array v a) -> Array v a
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v (Array v a) -> Array v a
joins (Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Vector Int -> Vector Int
S.dimsOf (Array v (Array v a) -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v (Array v a)
a))) Array v (Array v a)
a
joinSafe ::
(VG.Vector v (Array v a), VG.Vector v a, VG.Vector v (VU.Vector Int)) =>
Array v (Array v a) ->
Maybe (Array v a)
joinSafe :: forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a, Vector v (Vector Int)) =>
Array v (Array v a) -> Maybe (Array v a)
joinSafe Array v (Array v a)
a =
Maybe (Array v a) -> Maybe (Array v a) -> Bool -> Maybe (Array v a)
forall a. a -> a -> Bool -> a
bool
Maybe (Array v a)
forall a. Maybe a
Nothing
(Array v a -> Maybe (Array v a)
forall a. a -> Maybe a
Just (Array v a -> Maybe (Array v a)) -> Array v a -> Maybe (Array v a)
forall a b. (a -> b) -> a -> b
$ Array v (Array v a) -> Array v a
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
Array v (Array v a) -> Array v a
join Array v (Array v a)
a)
(Array v (Vector Int) -> Bool
forall a (v :: * -> *). (Eq a, Vector v a) => Array v a -> Bool
allEqual ((Array v a -> Vector Int)
-> Array v (Array v a) -> Array v (Vector Int)
forall (v :: * -> *) a b.
(Vector v a, Vector v b) =>
(a -> b) -> Array v a -> Array v b
fmapA Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v (Array v a)
a))
allEqual :: (Eq a, VG.Vector v a) => Array v a -> Bool
allEqual :: forall a (v :: * -> *). (Eq a, Vector v a) => Array v a -> Bool
allEqual Array v a
a = case v a -> [a]
forall (v :: * -> *) a. Vector v a => v a -> [a]
VG.toList (Array v a -> v a
forall {k} (v :: k -> *) (a :: k). Array v a -> v a
asVector Array v a
a) of
[] -> Bool
True
(a
x : [a]
xs) -> (a -> Bool) -> [a] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
x) [a]
xs
traverses ::
(VG.Vector v a, VG.Vector v b, VG.Vector v (Array v a), VG.Vector v (Array v b), VG.Vector v (f b), VG.Vector v (f (Array v b))) =>
(Applicative f) =>
Dims ->
(a -> f b) ->
Array v a ->
f (Array v b)
traverses :: forall (v :: * -> *) a b (f :: * -> *).
(Vector v a, Vector v b, Vector v (Array v a),
Vector v (Array v b), Vector v (f b), Vector v (f (Array v b)),
Applicative f) =>
[Int] -> (a -> f b) -> Array v a -> f (Array v b)
traverses [Int]
ds a -> f b
f Array v a
a = [Int] -> Array v (Array v b) -> Array v b
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v (Array v a) -> Array v a
joins [Int]
ds (Array v (Array v b) -> Array v b)
-> f (Array v (Array v b)) -> f (Array v b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Array v a -> f (Array v b))
-> Array v (Array v a) -> f (Array v (Array v b))
forall (f :: * -> *) (v :: * -> *) a b.
(Applicative f, Vector v a, Vector v b, Vector v (f b)) =>
(a -> f b) -> Array v a -> f (Array v b)
traverseA ((a -> f b) -> Array v a -> f (Array v b)
forall (f :: * -> *) (v :: * -> *) a b.
(Applicative f, Vector v a, Vector v b, Vector v (f b)) =>
(a -> f b) -> Array v a -> f (Array v b)
traverseA a -> f b
f) ([Int] -> Array v a -> Array v (Array v a)
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v a -> Array v (Array v a)
extracts [Int]
ds Array v a
a)
maps ::
(VG.Vector v a, VG.Vector v b, VG.Vector v (Array v a), VG.Vector v (Array v b)) =>
Dims ->
(Array v a -> Array v b) ->
Array v a ->
Array v b
maps :: forall (v :: * -> *) a b.
(Vector v a, Vector v b, Vector v (Array v a),
Vector v (Array v b)) =>
[Int] -> (Array v a -> Array v b) -> Array v a -> Array v b
maps [Int]
ds Array v a -> Array v b
f Array v a
a = [Int] -> Array v (Array v b) -> Array v b
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v (Array v a) -> Array v a
joins [Int]
ds ((Array v a -> Array v b)
-> Array v (Array v a) -> Array v (Array v b)
forall (v :: * -> *) a b.
(Vector v a, Vector v b) =>
(a -> b) -> Array v a -> Array v b
fmapA Array v a -> Array v b
f ([Int] -> Array v a -> Array v (Array v a)
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v a -> Array v (Array v a)
extracts [Int]
ds Array v a
a))
filters ::
(VG.Vector v a, VG.Vector v (Array v a)) =>
Dims ->
(Array v a -> Bool) ->
Array v a ->
Array v a
filters :: forall (v :: * -> *) a.
(Vector v a, Vector v (Array v a)) =>
[Int] -> (Array v a -> Bool) -> Array v a -> Array v a
filters [Int]
ds Array v a -> Bool
p Array v a
a = Array v (Array v a) -> Array v a
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
Array v (Array v a) -> Array v a
join ([Int] -> v (Array v a) -> Array v (Array v a)
forall {k} (v :: k -> *) (a :: k). [Int] -> v a -> Array v a
unsafeArrayL [v (Array v a) -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
VG.length v (Array v a)
v'] v (Array v a)
v')
where
v' :: v (Array v a)
v' = (Array v a -> Bool) -> v (Array v a) -> v (Array v a)
forall (v :: * -> *) a. Vector v a => (a -> Bool) -> v a -> v a
VG.filter Array v a -> Bool
p (Array v (Array v a) -> v (Array v a)
forall {k} (v :: k -> *) (a :: k). Array v a -> v a
asVector ([Int] -> Array v a -> Array v (Array v a)
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v a -> Array v (Array v a)
extracts [Int]
ds Array v a
a))
zips ::
(VG.Vector v a, VG.Vector v b, VG.Vector v c, VG.Vector v (Array v a), VG.Vector v (Array v b), VG.Vector v (Array v c)) =>
Dims ->
(Array v a -> Array v b -> Array v c) ->
Array v a ->
Array v b ->
Array v c
zips :: forall (v :: * -> *) a b c.
(Vector v a, Vector v b, Vector v c, Vector v (Array v a),
Vector v (Array v b), Vector v (Array v c)) =>
[Int]
-> (Array v a -> Array v b -> Array v c)
-> Array v a
-> Array v b
-> Array v c
zips [Int]
ds Array v a -> Array v b -> Array v c
f Array v a
a Array v b
b = [Int] -> Array v (Array v c) -> Array v c
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v (Array v a) -> Array v a
joins [Int]
ds ((Array v a -> Array v b -> Array v c)
-> Array v (Array v a)
-> Array v (Array v b)
-> Array v (Array v c)
forall (v :: * -> *) a b c.
(Vector v a, Vector v b, Vector v c) =>
(a -> b -> c) -> Array v a -> Array v b -> Array v c
zipWith Array v a -> Array v b -> Array v c
f ([Int] -> Array v a -> Array v (Array v a)
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v a -> Array v (Array v a)
extracts [Int]
ds Array v a
a) ([Int] -> Array v b -> Array v (Array v b)
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v a -> Array v (Array v a)
extracts [Int]
ds Array v b
b))
zipsSafe ::
(VG.Vector v a, VG.Vector v b, VG.Vector v c, VG.Vector v (Array v a), VG.Vector v (Array v b), VG.Vector v (Array v c)) =>
Dims ->
(Array v a -> Array v b -> Array v c) ->
Array v a ->
Array v b ->
Maybe (Array v c)
zipsSafe :: forall (v :: * -> *) a b c.
(Vector v a, Vector v b, Vector v c, Vector v (Array v a),
Vector v (Array v b), Vector v (Array v c)) =>
[Int]
-> (Array v a -> Array v b -> Array v c)
-> Array v a
-> Array v b
-> Maybe (Array v c)
zipsSafe [Int]
ds Array v a -> Array v b -> Array v c
f Array v a
a Array v b
b =
Maybe (Array v c) -> Maybe (Array v c) -> Bool -> Maybe (Array v c)
forall a. a -> a -> Bool -> a
bool
(Array v c -> Maybe (Array v c)
forall a. a -> Maybe a
Just (Array v c -> Maybe (Array v c)) -> Array v c -> Maybe (Array v c)
forall a b. (a -> b) -> a -> b
$ [Int] -> Array v (Array v c) -> Array v c
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v (Array v a) -> Array v a
joins [Int]
ds ((Array v a -> Array v b -> Array v c)
-> Array v (Array v a)
-> Array v (Array v b)
-> Array v (Array v c)
forall (v :: * -> *) a b c.
(Vector v a, Vector v b, Vector v c) =>
(a -> b -> c) -> Array v a -> Array v b -> Array v c
zipWith Array v a -> Array v b -> Array v c
f ([Int] -> Array v a -> Array v (Array v a)
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v a -> Array v (Array v a)
extracts [Int]
ds Array v a
a) ([Int] -> Array v b -> Array v (Array v b)
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v a -> Array v (Array v a)
extracts [Int]
ds Array v b
b)))
Maybe (Array v c)
forall a. Maybe a
Nothing
(Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a Vector Int -> Vector Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Array v b -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v b
b)
modifies ::
(VG.Vector v a, VG.Vector v (Array v a)) =>
(Array v a -> Array v a) ->
Dims ->
[Int] ->
Array v a ->
Array v a
modifies :: forall (v :: * -> *) a.
(Vector v a, Vector v (Array v a)) =>
(Array v a -> Array v a)
-> [Int] -> [Int] -> Array v a -> Array v a
modifies Array v a -> Array v a
f [Int]
ds [Int]
ps Array v a
a = [Int] -> Array v (Array v a) -> Array v a
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v (Array v a) -> Array v a
joins [Int]
ds (Array v (Array v a) -> Array v a)
-> Array v (Array v a) -> Array v a
forall a b. (a -> b) -> a -> b
$ [Int]
-> (Array v a -> Array v a)
-> Array v (Array v a)
-> Array v (Array v a)
forall (v :: * -> *) a.
Vector v a =>
[Int] -> (a -> a) -> Array v a -> Array v a
modify [Int]
ps Array v a -> Array v a
f ([Int] -> Array v a -> Array v (Array v a)
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v a -> Array v (Array v a)
extracts [Int]
ds Array v a
a)
diffs :: (VG.Vector v a, VG.Vector v b, VG.Vector v (Array v a), VG.Vector v (Array v b)) => Dims -> [Int] -> (Array v a -> Array v a -> Array v b) -> Array v a -> Array v b
diffs :: forall (v :: * -> *) a b.
(Vector v a, Vector v b, Vector v (Array v a),
Vector v (Array v b)) =>
[Int]
-> [Int]
-> (Array v a -> Array v a -> Array v b)
-> Array v a
-> Array v b
diffs [Int]
ds [Int]
xs Array v a -> Array v a -> Array v b
f Array v a
a = [Int]
-> (Array v a -> Array v a -> Array v b)
-> Array v a
-> Array v a
-> Array v b
forall (v :: * -> *) a b c.
(Vector v a, Vector v b, Vector v c, Vector v (Array v a),
Vector v (Array v b), Vector v (Array v c)) =>
[Int]
-> (Array v a -> Array v b -> Array v c)
-> Array v a
-> Array v b
-> Array v c
zips [Int]
ds Array v a -> Array v a -> Array v b
f ([Int] -> [Int] -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
[Int] -> [Int] -> Array v a -> Array v a
drops [Int]
ds [Int]
xs Array v a
a) ([Int] -> [Int] -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
[Int] -> [Int] -> Array v a -> Array v a
drops [Int]
ds ((Int -> Int) -> [Int] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Int -> Int
forall a. Num a => a -> a
P.negate [Int]
xs) Array v a
a)
expand ::
(VG.Vector v a, VG.Vector v b, VG.Vector v c) =>
(a -> b -> c) ->
Array v a ->
Array v b ->
Array v c
expand :: forall (v :: * -> *) a b c.
(Vector v a, Vector v b, Vector v c) =>
(a -> b -> c) -> Array v a -> Array v b -> Array v c
expand a -> b -> c
f Array v a
a Array v b
b = [Int] -> ([Int] -> c) -> Array v c
forall (v :: * -> *) a.
Vector v a =>
[Int] -> ([Int] -> a) -> Array v a
tabulate (Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a Vector Int -> Vector Int -> Vector Int
forall a. Semigroup a => a -> a -> a
<> Array v b -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v b
b)) (\[Int]
i -> a -> b -> c
f (Array v a -> [Int] -> a
forall (v :: * -> *) a. Vector v a => Array v a -> [Int] -> a
index Array v a
a (Int -> [Int] -> [Int]
forall a. Int -> [a] -> [a]
List.take Int
r [Int]
i)) (Array v b -> [Int] -> b
forall (v :: * -> *) a. Vector v a => Array v a -> [Int] -> a
index Array v b
b (Int -> [Int] -> [Int]
forall a. Int -> [a] -> [a]
List.drop Int
r [Int]
i)))
where
r :: Int
r = Array v a -> Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Int
rank Array v a
a
coexpand ::
(VG.Vector v a, VG.Vector v b, VG.Vector v c) =>
(a -> b -> c) ->
Array v a ->
Array v b ->
Array v c
coexpand :: forall (v :: * -> *) a b c.
(Vector v a, Vector v b, Vector v c) =>
(a -> b -> c) -> Array v a -> Array v b -> Array v c
coexpand a -> b -> c
f Array v a
a Array v b
b = [Int] -> ([Int] -> c) -> Array v c
forall (v :: * -> *) a.
Vector v a =>
[Int] -> ([Int] -> a) -> Array v a
tabulate (Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Array v b -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v b
b Vector Int -> Vector Int -> Vector Int
forall a. Semigroup a => a -> a -> a
<> Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a)) (\[Int]
i -> a -> b -> c
f (Array v a -> [Int] -> a
forall (v :: * -> *) a. Vector v a => Array v a -> [Int] -> a
index Array v a
a (Int -> [Int] -> [Int]
forall a. Int -> [a] -> [a]
List.drop Int
rb [Int]
i)) (Array v b -> [Int] -> b
forall (v :: * -> *) a. Vector v a => Array v a -> [Int] -> a
index Array v b
b (Int -> [Int] -> [Int]
forall a. Int -> [a] -> [a]
List.take Int
rb [Int]
i)))
where
rb :: Int
rb = Array v b -> Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Int
rank Array v b
b
contract ::
(VG.Vector v a, VG.Vector v b, VG.Vector v (Array v a)) =>
Dims ->
(Array v a -> b) ->
Array v a ->
Array v b
contract :: forall (v :: * -> *) a b.
(Vector v a, Vector v b, Vector v (Array v a)) =>
[Int] -> (Array v a -> b) -> Array v a -> Array v b
contract [Int]
ds Array v a -> b
f Array v a
a = (Array v a -> b) -> Array v (Array v a) -> Array v b
forall (v :: * -> *) a b.
(Vector v a, Vector v b) =>
(a -> b) -> Array v a -> Array v b
fmapA (Array v a -> b
f (Array v a -> b) -> (Array v a -> Array v a) -> Array v a -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array v a -> Array v a
forall (v :: * -> *) a. Vector v a => Array v a -> Array v a
diag) ([Int] -> Array v a -> Array v (Array v a)
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v a -> Array v (Array v a)
extracts (Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Vector Int -> Vector Int -> Vector Int
S.exceptDims ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
ds) (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a))) Array v a
a)
prod ::
(VG.Vector v a, VG.Vector v b, VG.Vector v c, VG.Vector v d) =>
Dims ->
Dims ->
(Array v c -> d) ->
(a -> b -> c) ->
Array v a ->
Array v b ->
Array v d
prod :: forall (v :: * -> *) a b c d.
(Vector v a, Vector v b, Vector v c, Vector v d) =>
[Int]
-> [Int]
-> (Array v c -> d)
-> (a -> b -> c)
-> Array v a
-> Array v b
-> Array v d
prod [Int]
ds0 [Int]
ds1 Array v c -> d
g a -> b -> c
f Array v a
a Array v b
b =
Vector Int -> (Vector Int -> d) -> Array v d
forall (v :: * -> *) a.
Vector v a =>
Vector Int -> (Vector Int -> a) -> Array v a
tabulateV
(Vector Int -> Vector Int -> Vector Int
S.deleteDims Vector Int
ds0V (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a) Vector Int -> Vector Int -> Vector Int
forall a. Semigroup a => a -> a -> a
<> Vector Int -> Vector Int -> Vector Int
S.deleteDims Vector Int
ds1V (Array v b -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v b
b))
( \Vector Int
so ->
Array v c -> d
g (Array v c -> d) -> Array v c -> d
forall a b. (a -> b) -> a -> b
$
Vector Int -> (Vector Int -> c) -> Array v c
forall (v :: * -> *) a.
Vector v a =>
Vector Int -> (Vector Int -> a) -> Array v a
tabulateV
(Vector Int -> Vector Int -> Vector Int
S.getDims Vector Int
ds0V (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a))
( \Vector Int
si ->
a -> b -> c
f
(Array v a -> Vector Int -> a
forall (v :: * -> *) a. Vector v a => Array v a -> Vector Int -> a
indexV Array v a
a (Vector Int -> Vector Int -> Vector Int -> Vector Int
S.insertDims Vector Int
ds0V Vector Int
si (Int -> Vector Int -> Vector Int
forall a. Unbox a => Int -> Vector a -> Vector a
VU.take Int
sp Vector Int
so)))
(Array v b -> Vector Int -> b
forall (v :: * -> *) a. Vector v a => Array v a -> Vector Int -> a
indexV Array v b
b (Vector Int -> Vector Int -> Vector Int -> Vector Int
S.insertDims Vector Int
ds1V Vector Int
si (Int -> Vector Int -> Vector Int
forall a. Unbox a => Int -> Vector a -> Vector a
VU.drop Int
sp Vector Int
so)))
)
)
where
ds0V :: Vector Int
ds0V = [Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
ds0
ds1V :: Vector Int
ds1V = [Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
ds1
sp :: Int
sp = Array v a -> Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Int
rank Array v a
a Int -> Int -> Int
forall a. Num a => a -> a -> a
- Vector Int -> Int
forall a. Unbox a => Vector a -> Int
VU.length Vector Int
ds0V
dot ::
(VG.Vector v a, VG.Vector v b, VG.Vector v c, VG.Vector v d, VG.Vector v (Array v c)) =>
(Array v c -> d) ->
(a -> b -> c) ->
Array v a ->
Array v b ->
Array v d
dot :: forall (v :: * -> *) a b c d.
(Vector v a, Vector v b, Vector v c, Vector v d,
Vector v (Array v c)) =>
(Array v c -> d)
-> (a -> b -> c) -> Array v a -> Array v b -> Array v d
dot Array v c -> d
f a -> b -> c
g Array v a
a Array v b
b = [Int] -> (Array v c -> d) -> Array v c -> Array v d
forall (v :: * -> *) a b.
(Vector v a, Vector v b, Vector v (Array v a)) =>
[Int] -> (Array v a -> b) -> Array v a -> Array v b
contract [Int
r Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1, Int
r] Array v c -> d
f ((a -> b -> c) -> Array v a -> Array v b -> Array v c
forall (v :: * -> *) a b c.
(Vector v a, Vector v b, Vector v c) =>
(a -> b -> c) -> Array v a -> Array v b -> Array v c
expand a -> b -> c
g Array v a
a Array v b
b)
where
r :: Int
r = Array v a -> Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Int
rank Array v a
a
mult ::
(VG.Vector v a) =>
(Add.Additive a, Mult.Multiplicative a) =>
Array v a ->
Array v a ->
Array v a
mult :: forall (v :: * -> *) a.
(Vector v a, Additive a, Multiplicative a) =>
Array v a -> Array v a -> Array v a
mult Array v a
a Array v a
b = [Int]
-> [Int]
-> (Array v a -> a)
-> (a -> a -> a)
-> Array v a
-> Array v a
-> Array v a
forall (v :: * -> *) a b c d.
(Vector v a, Vector v b, Vector v c, Vector v d) =>
[Int]
-> [Int]
-> (Array v c -> d)
-> (a -> b -> c)
-> Array v a
-> Array v b
-> Array v d
prod [Array v a -> Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Int
rank Array v a
a Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1] [Int
0] ((a -> a -> a) -> a -> Array v a -> a
forall (v :: * -> *) a b.
Vector v a =>
(a -> b -> b) -> b -> Array v a -> b
foldrA a -> a -> a
forall a. Additive a => a -> a -> a
(Add.+) a
forall a. Additive a => a
Add.zero) a -> a -> a
forall a. Multiplicative a => a -> a -> a
(Mult.*) Array v a
a Array v a
b
windows :: (VG.Vector v a) => [Int] -> Array v a -> Array v a
windows :: forall (v :: * -> *) a.
Vector v a =>
[Int] -> Array v a -> Array v a
windows [Int]
xs Array v a
a = (Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
(Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
backpermute (Vector Int -> Vector Int -> Vector Int
S.expandWindows ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
xs)) (Int -> Vector Int -> Vector Int
S.indexWindows ([Int] -> Int
forall a. [a] -> Int
S.rankL [Int]
xs)) Array v a
a
find :: (Eq (v a), VG.Vector v Bool, VG.Vector v a, VG.Vector v (Array v a)) => Array v a -> Array v a -> Array v Bool
find :: forall (v :: * -> *) a.
(Eq (v a), Vector v Bool, Vector v a, Vector v (Array v a)) =>
Array v a -> Array v a -> Array v Bool
find Array v a
i Array v a
a = Array v Bool
xs
where
i' :: Array v a
i' = Int -> Array v a -> Array v a
forall {k} (v :: k -> *) (a :: k). Int -> Array v a -> Array v a
rerank (Array v a -> Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Int
rank Array v a
a) Array v a
i
ws :: Array v a
ws = [Int] -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
[Int] -> Array v a -> Array v a
windows (Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
i')) Array v a
a
xs :: Array v Bool
xs = (Array v a -> Bool) -> Array v (Array v a) -> Array v Bool
forall (v :: * -> *) a b.
(Vector v a, Vector v b) =>
(a -> b) -> Array v a -> Array v b
fmapA (Array v a -> Array v a -> Bool
forall a. Eq a => a -> a -> Bool
== Array v a
i') ([Int] -> Array v a -> Array v (Array v a)
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v a -> Array v (Array v a)
extracts (Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Vector Int -> Vector Int -> Vector Int
S.dimWindows (Vector Int -> Vector Int -> Vector Int
S.expandWindows (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
i') (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a)) (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a))) Array v a
ws)
findNoOverlap :: (Eq (v a), VG.Vector v Bool, VG.Vector v a, VG.Vector v (Array v a)) => Array v a -> Array v a -> Array v Bool
findNoOverlap :: forall (v :: * -> *) a.
(Eq (v a), Vector v Bool, Vector v a, Vector v (Array v a)) =>
Array v a -> Array v a -> Array v Bool
findNoOverlap Array v a
i Array v a
a = Array v Bool
r
where
f :: Array v Bool
f = Array v a -> Array v a -> Array v Bool
forall (v :: * -> *) a.
(Eq (v a), Vector v Bool, Vector v a, Vector v (Array v a)) =>
Array v a -> Array v a -> Array v Bool
find Array v a
i Array v a
a
cl :: [Int] -> [[Int]]
cl :: [Int] -> [[Int]]
cl [Int]
sh =
([Int] -> Bool) -> [[Int]] -> [[Int]]
forall a. (a -> Bool) -> [a] -> [a]
List.filter (Bool -> Bool
P.not (Bool -> Bool) -> ([Int] -> Bool) -> [Int] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0) ([Int] -> Bool) -> ([Int] -> [Int]) -> [Int] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int] -> [Int]
forall a. HasCallStack => [a] -> [a]
List.init) ([[Int]] -> [[Int]]) -> [[Int]] -> [[Int]]
forall a b. (a -> b) -> a -> b
$
([Int] -> Bool) -> [[Int]] -> [[Int]]
forall a. (a -> Bool) -> [a] -> [a]
List.filter (Bool -> Bool
P.not (Bool -> Bool) -> ([Int] -> Bool) -> [Int] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
0)) ([[Int]] -> [[Int]]) -> [[Int]] -> [[Int]]
forall a b. (a -> b) -> a -> b
$
([Int] -> [Int]) -> [[Int]] -> [[Int]]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\[Int]
s -> (Int -> Int -> Int) -> [Int] -> [Int] -> [Int]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
List.zipWith (\Int
x Int
x0 -> Int
x Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
x0 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) [Int]
s [Int]
sh) ((Int -> [Int]) -> [Int] -> [[Int]]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse (\Int
x -> [Int
0 .. (Int
2 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
x Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
2)]) [Int]
sh)
go :: Array v Bool -> [Int] -> Bool
go Array v Bool
r' [Int]
s = Array v Bool -> [Int] -> Bool
forall (v :: * -> *) a. Vector v a => Array v a -> [Int] -> a
index Array v Bool
f [Int]
s Bool -> Bool -> Bool
&& Bool -> Bool
not (([Int] -> Bool) -> [[Int]] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Array v Bool -> [Int] -> Bool
forall (v :: * -> *) a. Vector v a => Array v a -> [Int] -> a
index Array v Bool
r') (([Int] -> Bool) -> [[Int]] -> [[Int]]
forall a. (a -> Bool) -> [a] -> [a]
List.filter (\[Int]
x -> Vector Int -> Vector Int -> Bool
S.isFins ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
x) (Array v Bool -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v Bool
f)) ([[Int]] -> [[Int]]) -> [[Int]] -> [[Int]]
forall a b. (a -> b) -> a -> b
$ ([Int] -> [Int]) -> [[Int]] -> [[Int]]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Int -> Int -> Int) -> [Int] -> [Int] -> [Int]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
List.zipWith Int -> Int -> Int
forall a. Num a => a -> a -> a
(+) [Int]
s) ([Int] -> [[Int]]
cl (Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
i)))))
r :: Array v Bool
r = [Int] -> ([Int] -> Bool) -> Array v Bool
forall (v :: * -> *) a.
Vector v a =>
[Int] -> ([Int] -> a) -> Array v a
tabulate (Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Array v Bool -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v Bool
f)) (Array v Bool -> [Int] -> Bool
go Array v Bool
r)
findIndices :: (Eq (v a), VG.Vector v [Int], VG.Vector v a, VG.Vector v Bool, VG.Vector v ([Int], Bool), VG.Vector v (Array v a)) => Array v a -> Array v a -> Array v [Int]
findIndices :: forall (v :: * -> *) a.
(Eq (v a), Vector v [Int], Vector v a, Vector v Bool,
Vector v ([Int], Bool), Vector v (Array v a)) =>
Array v a -> Array v a -> Array v [Int]
findIndices Array v a
i Array v a
a = [Int] -> v [Int] -> Array v [Int]
forall {k} (v :: k -> *) (a :: k). [Int] -> v a -> Array v a
unsafeArrayL [v ([Int], Bool) -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
VG.length v ([Int], Bool)
v'] ((([Int], Bool) -> [Int]) -> v ([Int], Bool) -> v [Int]
forall (v :: * -> *) a b.
(Vector v a, Vector v b) =>
(a -> b) -> v a -> v b
VG.map ([Int], Bool) -> [Int]
forall a b. (a, b) -> a
fst v ([Int], Bool)
v')
where
v' :: v ([Int], Bool)
v' = (([Int], Bool) -> Bool) -> v ([Int], Bool) -> v ([Int], Bool)
forall (v :: * -> *) a. Vector v a => (a -> Bool) -> v a -> v a
VG.filter ([Int], Bool) -> Bool
forall a b. (a, b) -> b
snd (Array v ([Int], Bool) -> v ([Int], Bool)
forall {k} (v :: k -> *) (a :: k). Array v a -> v a
asVector (([Int] -> Bool -> ([Int], Bool))
-> Array v Bool -> Array v ([Int], Bool)
forall (v :: * -> *) a b.
(Vector v a, Vector v b, Vector v [Int]) =>
([Int] -> a -> b) -> Array v a -> Array v b
imap (,) Array v Bool
b))
b :: Array v Bool
b = Array v a -> Array v a -> Array v Bool
forall (v :: * -> *) a.
(Eq (v a), Vector v Bool, Vector v a, Vector v (Array v a)) =>
Array v a -> Array v a -> Array v Bool
find Array v a
i Array v a
a
isPrefixOf :: (Eq (v a), VG.Vector v a) => Array v a -> Array v a -> Bool
isPrefixOf :: forall (v :: * -> *) a.
(Eq (v a), Vector v a) =>
Array v a -> Array v a -> Bool
isPrefixOf Array v a
p Array v a
a = Array v a
p Array v a -> Array v a -> Bool
forall a. Eq a => a -> a -> Bool
== [Int] -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
[Int] -> Array v a -> Array v a
cut (Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
p)) Array v a
a
isSuffixOf :: (Eq (v a), VG.Vector v a) => Array v a -> Array v a -> Bool
isSuffixOf :: forall (v :: * -> *) a.
(Eq (v a), Vector v a) =>
Array v a -> Array v a -> Bool
isSuffixOf Array v a
p Array v a
a = Array v a
p Array v a -> Array v a -> Bool
forall a. Eq a => a -> a -> Bool
== [Int] -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
[Int] -> Array v a -> Array v a
cutSuffix (Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
p)) Array v a
a
isInfixOf :: (Eq (v a), VG.Vector v a, VG.Vector v Bool, VG.Vector v (Array v a)) => Array v a -> Array v a -> Bool
isInfixOf :: forall (v :: * -> *) a.
(Eq (v a), Vector v a, Vector v Bool, Vector v (Array v a)) =>
Array v a -> Array v a -> Bool
isInfixOf Array v a
p Array v a
a = (Bool -> Bool -> Bool) -> Bool -> Array v Bool -> Bool
forall (v :: * -> *) a b.
Vector v a =>
(a -> b -> b) -> b -> Array v a -> b
foldrA Bool -> Bool -> Bool
(||) Bool
False (Array v a -> Array v a -> Array v Bool
forall (v :: * -> *) a.
(Eq (v a), Vector v Bool, Vector v a, Vector v (Array v a)) =>
Array v a -> Array v a -> Array v Bool
find Array v a
p Array v a
a)
fill :: (VG.Vector v a) => a -> Array v a -> Array v a
fill :: forall (v :: * -> *) a. Vector v a => a -> Array v a -> Array v a
fill a
x (UnsafeArray Vector Int
s Vector Int
_ v a
v) = Vector Int -> v a -> Array v a
forall {k} (v :: k -> *) (a :: k). Vector Int -> v a -> Array v a
unsafeArray Vector Int
s (Int -> v a -> v a
forall (v :: * -> *) a. Vector v a => Int -> v a -> v a
VG.take (Vector Int -> Int
S.size Vector Int
s) (v a
v v a -> v a -> v a
forall (v :: * -> *) a. Vector v a => v a -> v a -> v a
VG.++ Int -> a -> v a
forall (v :: * -> *) a. Vector v a => Int -> a -> v a
VG.replicate (Vector Int -> Int
S.size Vector Int
s Int -> Int -> Int
forall a. Num a => a -> a -> a
- v a -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
VG.length v a
v) a
x))
cut ::
(VG.Vector v a) =>
[Int] ->
Array v a ->
Array v a
cut :: forall (v :: * -> *) a.
Vector v a =>
[Int] -> Array v a -> Array v a
cut [Int]
s' Array v a
a = Array v a -> Array v a -> Bool -> Array v a
forall a. a -> a -> Bool -> a
bool (String -> Array v a
forall a. HasCallStack => String -> a
error String
"bad cut") ([Int] -> ([Int] -> a) -> Array v a
forall (v :: * -> *) a.
Vector v a =>
[Int] -> ([Int] -> a) -> Array v a
tabulate [Int]
s' (Array v a -> [Int] -> a
forall (v :: * -> *) a. Vector v a => Array v a -> [Int] -> a
index Array v a
a')) (Vector Int -> Vector Int -> Bool
S.isSubset ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
s') (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a))
where
a' :: Array v a
a' = Int -> Array v a -> Array v a
forall {k} (v :: k -> *) (a :: k). Int -> Array v a -> Array v a
rerank ([Int] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
List.length [Int]
s') Array v a
a
cutSuffix ::
(VG.Vector v a) =>
[Int] ->
Array v a ->
Array v a
cutSuffix :: forall (v :: * -> *) a.
Vector v a =>
[Int] -> Array v a -> Array v a
cutSuffix [Int]
s' Array v a
a = Array v a -> Array v a -> Bool -> Array v a
forall a. a -> a -> Bool -> a
bool (String -> Array v a
forall a. HasCallStack => String -> a
error String
"bad cut") ([Int] -> ([Int] -> a) -> Array v a
forall (v :: * -> *) a.
Vector v a =>
[Int] -> ([Int] -> a) -> Array v a
tabulate [Int]
s' (Array v a -> [Int] -> a
forall (v :: * -> *) a. Vector v a => Array v a -> [Int] -> a
index Array v a
a' ([Int] -> a) -> ([Int] -> [Int]) -> [Int] -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Int -> Int) -> [Int] -> [Int] -> [Int]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
List.zipWith Int -> Int -> Int
forall a. Num a => a -> a -> a
(+) [Int]
diffDim)) (Vector Int -> Vector Int -> Bool
S.isSubset ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
s') (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a))
where
a' :: Array v a
a' = Int -> Array v a -> Array v a
forall {k} (v :: k -> *) (a :: k). Int -> Array v a -> Array v a
rerank ([Int] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
List.length [Int]
s') Array v a
a
diffDim :: [Int]
diffDim = Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList ((Int -> Int -> Int) -> Vector Int -> Vector Int -> Vector Int
forall a b c.
(Unbox a, Unbox b, Unbox c) =>
(a -> b -> c) -> Vector a -> Vector b -> Vector c
VU.zipWith (-) (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a') ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
s'))
pad ::
(VG.Vector v a) =>
a ->
[Int] ->
Array v a ->
Array v a
pad :: forall (v :: * -> *) a.
Vector v a =>
a -> [Int] -> Array v a -> Array v a
pad a
d [Int]
s' Array v a
a = [Int] -> ([Int] -> a) -> Array v a
forall (v :: * -> *) a.
Vector v a =>
[Int] -> ([Int] -> a) -> Array v a
tabulate [Int]
s' (\[Int]
s -> a -> a -> Bool -> a
forall a. a -> a -> Bool -> a
bool a
d (Array v a -> [Int] -> a
forall (v :: * -> *) a. Vector v a => Array v a -> [Int] -> a
index Array v a
a' [Int]
s) ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
s Vector Int -> Vector Int -> Bool
`S.isFins` Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a'))
where
a' :: Array v a
a' = Int -> Array v a -> Array v a
forall {k} (v :: k -> *) (a :: k). Int -> Array v a -> Array v a
rerank ([Int] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
List.length [Int]
s') Array v a
a
lpad ::
(VG.Vector v a) =>
a ->
[Int] ->
Array v a ->
Array v a
lpad :: forall (v :: * -> *) a.
Vector v a =>
a -> [Int] -> Array v a -> Array v a
lpad a
d [Int]
s' Array v a
a = [Int] -> ([Int] -> a) -> Array v a
forall (v :: * -> *) a.
Vector v a =>
[Int] -> ([Int] -> a) -> Array v a
tabulate [Int]
s' (\[Int]
s -> a -> a -> Bool -> a
forall a. a -> a -> Bool -> a
bool a
d (Array v a -> [Int] -> a
forall (v :: * -> *) a. Vector v a => Array v a -> [Int] -> a
index Array v a
a' ([Int] -> [Int]
olds [Int]
s)) ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList ([Int] -> [Int]
olds [Int]
s) Vector Int -> Vector Int -> Bool
`S.isFins` Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a'))
where
a' :: Array v a
a' = Int -> Array v a -> Array v a
forall {k} (v :: k -> *) (a :: k). Int -> Array v a -> Array v a
rerank ([Int] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
List.length [Int]
s') Array v a
a
gap :: [Int]
gap = Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList ((Int -> Int -> Int) -> Vector Int -> Vector Int -> Vector Int
forall a b c.
(Unbox a, Unbox b, Unbox c) =>
(a -> b -> c) -> Vector a -> Vector b -> Vector c
VU.zipWith (-) ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
s') (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a'))
olds :: [Int] -> [Int]
olds [Int]
s = (Int -> Int -> Int) -> [Int] -> [Int] -> [Int]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
List.zipWith (-) [Int]
s [Int]
gap
reshape ::
(VG.Vector v a) =>
[Int] ->
Array v a ->
Array v a
reshape :: forall (v :: * -> *) a.
Vector v a =>
[Int] -> Array v a -> Array v a
reshape [Int]
s Array v a
a = (Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
(Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
backpermute (Vector Int -> Vector Int -> Vector Int
forall a b. a -> b -> a
const ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
s)) (Vector Int -> Int -> Vector Int
S.shapen (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a) (Int -> Vector Int)
-> (Vector Int -> Int) -> Vector Int -> Vector Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector Int -> Vector Int -> Int
S.flatten ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
s)) Array v a
a
flat :: Array v a -> Array v a
flat :: forall {k} (v :: k -> *) (a :: k). Array v a -> Array v a
flat Array v a
a = (Vector Int -> Vector Int) -> Array v a -> Array v a
forall {k} (v :: k -> *) (a :: k).
(Vector Int -> Vector Int) -> Array v a -> Array v a
unsafeModifyShape (Int -> Vector Int
forall a. Unbox a => a -> Vector a
VU.singleton (Int -> Vector Int)
-> (Vector Int -> Int) -> Vector Int -> Vector Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector Int -> Int
S.size) Array v a
a
repeat ::
(VG.Vector v a) =>
[Int] ->
Array v a ->
Array v a
repeat :: forall (v :: * -> *) a.
Vector v a =>
[Int] -> Array v a -> Array v a
repeat [Int]
s Array v a
a = (Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
(Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
backpermute (Vector Int -> Vector Int -> Vector Int
forall a b. a -> b -> a
const ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
s)) (Int -> Vector Int -> Vector Int
forall a. Unbox a => Int -> Vector a -> Vector a
VU.drop ([Int] -> Int
forall a. [a] -> Int
S.rankL [Int]
s Int -> Int -> Int
forall a. Num a => a -> a -> a
- Array v a -> Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Int
rank Array v a
a)) Array v a
a
cycle ::
(VG.Vector v a) =>
[Int] ->
Array v a ->
Array v a
cycle :: forall (v :: * -> *) a.
Vector v a =>
[Int] -> Array v a -> Array v a
cycle [Int]
s Array v a
a = (Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
(Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
backpermute (Vector Int -> Vector Int -> Vector Int
forall a b. a -> b -> a
const ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
s)) (Vector Int -> Int -> Vector Int
S.shapen (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a) (Int -> Vector Int)
-> (Vector Int -> Int) -> Vector Int -> Vector Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Array v a -> Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Int
size Array v a
a) (Int -> Int) -> (Vector Int -> Int) -> Vector Int -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector Int -> Vector Int -> Int
S.flatten ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
s)) Array v a
a
rerank :: Int -> Array v a -> Array v a
rerank :: forall {k} (v :: k -> *) (a :: k). Int -> Array v a -> Array v a
rerank Int
r Array v a
a = (Vector Int -> Vector Int) -> Array v a -> Array v a
forall {k} (v :: k -> *) (a :: k).
(Vector Int -> Vector Int) -> Array v a -> Array v a
unsafeModifyShape (Int -> Vector Int -> Vector Int
S.rerank Int
r) Array v a
a
reorder ::
(VG.Vector v a) =>
Dims ->
Array v a ->
Array v a
reorder :: forall (v :: * -> *) a.
Vector v a =>
[Int] -> Array v a -> Array v a
reorder [Int]
ds Array v a
a = (Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
(Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
backpermute (Vector Int -> Vector Int -> Vector Int
`S.reorder` [Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
ds) (\Vector Int
s -> Vector Int -> Vector Int -> Vector Int -> Vector Int
S.insertDims ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
ds) Vector Int
s Vector Int
forall a. Unbox a => Vector a
VU.empty) Array v a
a
squeeze ::
Array v a ->
Array v a
squeeze :: forall {k} (v :: k -> *) (a :: k). Array v a -> Array v a
squeeze Array v a
a = (Vector Int -> Vector Int) -> Array v a -> Array v a
forall {k} (v :: k -> *) (a :: k).
(Vector Int -> Vector Int) -> Array v a -> Array v a
unsafeModifyShape Vector Int -> Vector Int
S.squeeze Array v a
a
elongate ::
Dim ->
Array v a ->
Array v a
elongate :: forall {k} (v :: k -> *) (a :: k). Int -> Array v a -> Array v a
elongate Int
d Array v a
a = (Vector Int -> Vector Int) -> Array v a -> Array v a
forall {k} (v :: k -> *) (a :: k).
(Vector Int -> Vector Int) -> Array v a -> Array v a
unsafeModifyShape (Int -> Int -> Vector Int -> Vector Int
insertDim Int
d Int
1) Array v a
a
transpose :: (VG.Vector v a) => Array v a -> Array v a
transpose :: forall (v :: * -> *) a. Vector v a => Array v a -> Array v a
transpose Array v a
a = (Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
(Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
backpermute Vector Int -> Vector Int
forall a. Unbox a => Vector a -> Vector a
VU.reverse Vector Int -> Vector Int
forall a. Unbox a => Vector a -> Vector a
VU.reverse Array v a
a
inflate ::
(VG.Vector v a) =>
Dim ->
Int ->
Array v a ->
Array v a
inflate :: forall (v :: * -> *) a.
Vector v a =>
Int -> Int -> Array v a -> Array v a
inflate Int
d Int
n Array v a
a = (Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
(Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
backpermute (Int -> Int -> Vector Int -> Vector Int
insertDim Int
d Int
n) (Int -> Vector Int -> Vector Int
deleteDim Int
d) Array v a
a
intercalate :: (VG.Vector v a, VG.Vector v (Array v a)) => Dim -> Array v a -> Array v a -> Array v a
intercalate :: forall (v :: * -> *) a.
(Vector v a, Vector v (Array v a)) =>
Int -> Array v a -> Array v a -> Array v a
intercalate Int
d Array v a
i Array v a
a = [Int] -> Array v (Array v a) -> Array v a
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v (Array v a) -> Array v a
joins [Int
d] (Array v (Array v a) -> Array v a)
-> Array v (Array v a) -> Array v a
forall a b. (a -> b) -> a -> b
$ [Int] -> v (Array v a) -> Array v (Array v a)
forall {k} (v :: k -> *) (a :: k). [Int] -> v a -> Array v a
unsafeArrayL [[Array v a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
List.length [Array v a]
xs] ([Array v a] -> v (Array v a)
forall (v :: * -> *) a. Vector v a => [a] -> v a
VG.fromList [Array v a]
xs)
where
xs :: [Array v a]
xs = Array v a -> [Array v a] -> [Array v a]
forall a. a -> [a] -> [a]
List.intersperse Array v a
i (v (Array v a) -> [Array v a]
forall (v :: * -> *) a. Vector v a => v a -> [a]
VG.toList (Array v (Array v a) -> v (Array v a)
forall {k} (v :: k -> *) (a :: k). Array v a -> v a
asVector ([Int] -> Array v a -> Array v (Array v a)
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v a -> Array v (Array v a)
extracts [Int
d] Array v a
a)))
intersperse :: (VG.Vector v a, VG.Vector v (Array v a)) => Dim -> a -> Array v a -> Array v a
intersperse :: forall (v :: * -> *) a.
(Vector v a, Vector v (Array v a)) =>
Int -> a -> Array v a -> Array v a
intersperse Int
d a
i Array v a
a = Int -> Array v a -> Array v a -> Array v a
forall (v :: * -> *) a.
(Vector v a, Vector v (Array v a)) =>
Int -> Array v a -> Array v a -> Array v a
intercalate Int
d ([Int] -> a -> Array v a
forall (v :: * -> *) a. Vector v a => [Int] -> a -> Array v a
konst (Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Int -> Vector Int -> Vector Int
S.deleteDim Int
d (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a))) a
i) Array v a
a
concats ::
(VG.Vector v a) =>
Dims ->
Int ->
Array v a ->
Array v a
concats :: forall (v :: * -> *) a.
Vector v a =>
[Int] -> Int -> Array v a -> Array v a
concats [Int]
ds Int
n Array v a
a = (Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
(Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
backpermute (Vector Int -> Int -> Vector Int -> Vector Int
S.concatDims ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
ds) Int
n) (Vector Int -> Int -> Vector Int -> Vector Int -> Vector Int
S.unconcatDimsIndex ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
ds) Int
n (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a)) Array v a
a
reverses ::
(VG.Vector v a) =>
Dims ->
Array v a ->
Array v a
reverses :: forall (v :: * -> *) a.
Vector v a =>
[Int] -> Array v a -> Array v a
reverses [Int]
ds Array v a
a = (Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
(Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
backpermute Vector Int -> Vector Int
forall a. a -> a
id (Vector Int -> Vector Int -> Vector Int -> Vector Int
S.reverseIndex ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
ds) (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a)) Array v a
a
rotates ::
(VG.Vector v a) =>
Dims ->
[Int] ->
Array v a ->
Array v a
rotates :: forall (v :: * -> *) a.
Vector v a =>
[Int] -> [Int] -> Array v a -> Array v a
rotates [Int]
ds [Int]
rs Array v a
a = (Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
(Vector Int -> Vector Int)
-> (Vector Int -> Vector Int) -> Array v a -> Array v a
backpermute Vector Int -> Vector Int
forall a. a -> a
id (Vector Int -> Vector Int -> Vector Int -> Vector Int -> Vector Int
S.rotatesIndex ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
ds) ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
rs) (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a)) Array v a
a
sortG :: (Ord a, VG.Vector v a, VG.Vector v Int) => v a -> v a
sortG :: forall a (v :: * -> *).
(Ord a, Vector v a, Vector v Int) =>
v a -> v a
sortG v a
a = v a -> v Int -> v a
forall (v :: * -> *) a.
(HasCallStack, Vector v a, Vector v Int) =>
v a -> v Int -> v a
VG.backpermute v a
a (v a -> v Int
forall a (v :: * -> *).
(Ord a, Vector v a, Vector v Int) =>
v a -> v Int
orderG v a
a)
sortByG :: (Ord b, VG.Vector v a, VG.Vector v Int) => (a -> b) -> v a -> v a
sortByG :: forall b (v :: * -> *) a.
(Ord b, Vector v a, Vector v Int) =>
(a -> b) -> v a -> v a
sortByG a -> b
c v a
a = v a -> v Int -> v a
forall (v :: * -> *) a.
(HasCallStack, Vector v a, Vector v Int) =>
v a -> v Int -> v a
VG.backpermute v a
a ((a -> b) -> v a -> v Int
forall b (v :: * -> *) a.
(Ord b, Vector v a, Vector v Int) =>
(a -> b) -> v a -> v Int
orderByG a -> b
c v a
a)
orderG :: (Ord a, VG.Vector v a, VG.Vector v Int) => v a -> v Int
orderG :: forall a (v :: * -> *).
(Ord a, Vector v a, Vector v Int) =>
v a -> v Int
orderG v a
a = (forall s. Mutable v s Int -> ST s ()) -> v Int -> v Int
forall (v :: * -> *) a.
Vector v a =>
(forall s. Mutable v s a -> ST s ()) -> v a -> v a
VG.modify ((Int -> Int -> Ordering)
-> Mutable v (PrimState (ST s)) Int -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) e.
(PrimMonad m, MVector v e) =>
Comparison e -> v (PrimState m) e -> m ()
sortBy Int -> Int -> Ordering
comp) v Int
init0
where
comp :: Int -> Int -> Ordering
comp = (Int -> a) -> Int -> Int -> Ordering
forall a b. Ord a => (b -> a) -> b -> b -> Ordering
comparing ((Int -> a) -> Int -> Int -> Ordering)
-> (Int -> a) -> Int -> Int -> Ordering
forall a b. (a -> b) -> a -> b
$ v a -> Int -> a
forall (v :: * -> *) a. Vector v a => v a -> Int -> a
VG.unsafeIndex v a
a
init0 :: v Int
init0 = Int -> (Int -> Int) -> v Int
forall (v :: * -> *) a. Vector v a => Int -> (Int -> a) -> v a
VG.generate (v a -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
VG.length v a
a) Int -> Int
forall a. a -> a
id
orderByG :: (Ord b, VG.Vector v a, VG.Vector v Int) => (a -> b) -> v a -> v Int
orderByG :: forall b (v :: * -> *) a.
(Ord b, Vector v a, Vector v Int) =>
(a -> b) -> v a -> v Int
orderByG a -> b
c v a
a = (forall s. Mutable v s Int -> ST s ()) -> v Int -> v Int
forall (v :: * -> *) a.
Vector v a =>
(forall s. Mutable v s a -> ST s ()) -> v a -> v a
VG.modify ((Int -> Int -> Ordering)
-> Mutable v (PrimState (ST s)) Int -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) e.
(PrimMonad m, MVector v e) =>
Comparison e -> v (PrimState m) e -> m ()
sortBy Int -> Int -> Ordering
comp) v Int
init0
where
comp :: Int -> Int -> Ordering
comp = (Int -> b) -> Int -> Int -> Ordering
forall a b. Ord a => (b -> a) -> b -> b -> Ordering
comparing ((Int -> b) -> Int -> Int -> Ordering)
-> (Int -> b) -> Int -> Int -> Ordering
forall a b. (a -> b) -> a -> b
$ a -> b
c (a -> b) -> (Int -> a) -> Int -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v a -> Int -> a
forall (v :: * -> *) a. Vector v a => v a -> Int -> a
VG.unsafeIndex v a
a
init0 :: v Int
init0 = Int -> (Int -> Int) -> v Int
forall (v :: * -> *) a. Vector v a => Int -> (Int -> a) -> v a
VG.generate (v a -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
VG.length v a
a) Int -> Int
forall a. a -> a
id
sorts :: (Ord (v a), VG.Vector v a, VG.Vector v Int, VG.Vector v (Array v a)) => Dims -> Array v a -> Array v a
sorts :: forall (v :: * -> *) a.
(Ord (v a), Vector v a, Vector v Int, Vector v (Array v a)) =>
[Int] -> Array v a -> Array v a
sorts [Int]
ds Array v a
a = [Int] -> Array v (Array v a) -> Array v a
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v (Array v a) -> Array v a
joins [Int]
ds (Array v (Array v a) -> Array v a)
-> Array v (Array v a) -> Array v a
forall a b. (a -> b) -> a -> b
$ (v (Array v a) -> v (Array v a))
-> Array v (Array v a) -> Array v (Array v a)
forall {k} {k} (v :: k -> *) (a :: k) (v' :: k -> *) (b :: k).
(v a -> v' b) -> Array v a -> Array v' b
unsafeModifyVector v (Array v a) -> v (Array v a)
forall a (v :: * -> *).
(Ord a, Vector v a, Vector v Int) =>
v a -> v a
sortG ([Int] -> Array v a -> Array v (Array v a)
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v a -> Array v (Array v a)
extracts [Int]
ds Array v a
a)
sortsBy :: (Ord (v b), VG.Vector v a, VG.Vector v Int, VG.Vector v (Array v a)) => Dims -> (Array v a -> Array v b) -> Array v a -> Array v a
sortsBy :: forall (v :: * -> *) b a.
(Ord (v b), Vector v a, Vector v Int, Vector v (Array v a)) =>
[Int] -> (Array v a -> Array v b) -> Array v a -> Array v a
sortsBy [Int]
ds Array v a -> Array v b
c Array v a
a = [Int] -> Array v (Array v a) -> Array v a
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v (Array v a) -> Array v a
joins [Int]
ds (Array v (Array v a) -> Array v a)
-> Array v (Array v a) -> Array v a
forall a b. (a -> b) -> a -> b
$ (v (Array v a) -> v (Array v a))
-> Array v (Array v a) -> Array v (Array v a)
forall {k} {k} (v :: k -> *) (a :: k) (v' :: k -> *) (b :: k).
(v a -> v' b) -> Array v a -> Array v' b
unsafeModifyVector ((Array v a -> Array v b) -> v (Array v a) -> v (Array v a)
forall b (v :: * -> *) a.
(Ord b, Vector v a, Vector v Int) =>
(a -> b) -> v a -> v a
sortByG Array v a -> Array v b
c) ([Int] -> Array v a -> Array v (Array v a)
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v a -> Array v (Array v a)
extracts [Int]
ds Array v a
a)
orders :: (Ord (v a), VG.Vector v Int, VG.Vector v a, VG.Vector v (Array v a)) => Dims -> Array v a -> Array v Int
orders :: forall (v :: * -> *) a.
(Ord (v a), Vector v Int, Vector v a, Vector v (Array v a)) =>
[Int] -> Array v a -> Array v Int
orders [Int]
ds Array v a
a = [Int] -> v Int -> Array v Int
forall {k} (v :: k -> *) (a :: k). [Int] -> v a -> Array v a
unsafeArrayL [v Int -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
VG.length v Int
v'] v Int
v'
where
v' :: v Int
v' = v (Array v a) -> v Int
forall a (v :: * -> *).
(Ord a, Vector v a, Vector v Int) =>
v a -> v Int
orderG (Array v (Array v a) -> v (Array v a)
forall {k} (v :: k -> *) (a :: k). Array v a -> v a
asVector ([Int] -> Array v a -> Array v (Array v a)
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v a -> Array v (Array v a)
extracts [Int]
ds Array v a
a))
ordersBy :: (Ord (v b), VG.Vector v Int, VG.Vector v a, VG.Vector v (Array v a)) => Dims -> (Array v a -> Array v b) -> Array v a -> Array v Int
ordersBy :: forall (v :: * -> *) b a.
(Ord (v b), Vector v Int, Vector v a, Vector v (Array v a)) =>
[Int] -> (Array v a -> Array v b) -> Array v a -> Array v Int
ordersBy [Int]
ds Array v a -> Array v b
c Array v a
a = [Int] -> v Int -> Array v Int
forall {k} (v :: k -> *) (a :: k). [Int] -> v a -> Array v a
unsafeArrayL [v Int -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
VG.length v Int
v'] v Int
v'
where
v' :: v Int
v' = (Array v a -> Array v b) -> v (Array v a) -> v Int
forall b (v :: * -> *) a.
(Ord b, Vector v a, Vector v Int) =>
(a -> b) -> v a -> v Int
orderByG Array v a -> Array v b
c (Array v (Array v a) -> v (Array v a)
forall {k} (v :: k -> *) (a :: k). Array v a -> v a
asVector ([Int] -> Array v a -> Array v (Array v a)
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v a -> Array v (Array v a)
extracts [Int]
ds Array v a
a))
telecasts :: (VG.Vector v a, VG.Vector v b, VG.Vector v c, VG.Vector v (Array v a), VG.Vector v (Array v b), VG.Vector v (Array v c)) => Dims -> Dims -> (Array v a -> Array v b -> Array v c) -> Array v a -> Array v b -> Array v c
telecasts :: forall (v :: * -> *) a b c.
(Vector v a, Vector v b, Vector v c, Vector v (Array v a),
Vector v (Array v b), Vector v (Array v c)) =>
[Int]
-> [Int]
-> (Array v a -> Array v b -> Array v c)
-> Array v a
-> Array v b
-> Array v c
telecasts [Int]
dsa [Int]
dsb Array v a -> Array v b -> Array v c
f Array v a
a Array v b
b = (Array v a -> Array v b -> Array v c)
-> Array v (Array v a)
-> Array v (Array v b)
-> Array v (Array v c)
forall (v :: * -> *) a b c.
(Vector v a, Vector v b, Vector v c) =>
(a -> b -> c) -> Array v a -> Array v b -> Array v c
zipWith Array v a -> Array v b -> Array v c
f ([Int] -> Array v a -> Array v (Array v a)
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v a -> Array v (Array v a)
extracts [Int]
dsa Array v a
a) ([Int] -> Array v b -> Array v (Array v b)
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v a -> Array v (Array v a)
extracts [Int]
dsb Array v b
b) Array v (Array v c)
-> (Array v (Array v c) -> Array v c) -> Array v c
forall a b. a -> (a -> b) -> b
& [Int] -> Array v (Array v c) -> Array v c
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v (Array v a) -> Array v a
joins [Int]
dsa
telecastsSafe :: (VG.Vector v a, VG.Vector v b, VG.Vector v c, VG.Vector v (Array v a), VG.Vector v (Array v b), VG.Vector v (Array v c)) => Dims -> Dims -> (Array v a -> Array v b -> Array v c) -> Array v a -> Array v b -> Maybe (Array v c)
telecastsSafe :: forall (v :: * -> *) a b c.
(Vector v a, Vector v b, Vector v c, Vector v (Array v a),
Vector v (Array v b), Vector v (Array v c)) =>
[Int]
-> [Int]
-> (Array v a -> Array v b -> Array v c)
-> Array v a
-> Array v b
-> Maybe (Array v c)
telecastsSafe [Int]
dsa [Int]
dsb Array v a -> Array v b -> Array v c
f Array v a
a Array v b
b =
Maybe (Array v c) -> Maybe (Array v c) -> Bool -> Maybe (Array v c)
forall a. a -> a -> Bool -> a
bool
(Array v c -> Maybe (Array v c)
forall a. a -> Maybe a
Just (Array v c -> Maybe (Array v c)) -> Array v c -> Maybe (Array v c)
forall a b. (a -> b) -> a -> b
$ [Int]
-> [Int]
-> (Array v a -> Array v b -> Array v c)
-> Array v a
-> Array v b
-> Array v c
forall (v :: * -> *) a b c.
(Vector v a, Vector v b, Vector v c, Vector v (Array v a),
Vector v (Array v b), Vector v (Array v c)) =>
[Int]
-> [Int]
-> (Array v a -> Array v b -> Array v c)
-> Array v a
-> Array v b
-> Array v c
telecasts [Int]
dsa [Int]
dsb Array v a -> Array v b -> Array v c
f Array v a
a Array v b
b)
Maybe (Array v c)
forall a. Maybe a
Nothing
(Array v (Array v a) -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape ([Int] -> Array v a -> Array v (Array v a)
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v a -> Array v (Array v a)
extracts [Int]
dsa Array v a
a) Vector Int -> Vector Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Array v (Array v b) -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape ([Int] -> Array v b -> Array v (Array v b)
forall (v :: * -> *) a.
(Vector v (Array v a), Vector v a) =>
[Int] -> Array v a -> Array v (Array v a)
extracts [Int]
dsb Array v b
b))
transmit :: (VG.Vector v b, VG.Vector v c, VG.Vector v (Array v b), VG.Vector v (Array v c)) => (Array v a -> Array v b -> Array v c) -> Array v a -> Array v b -> Array v c
transmit :: forall (v :: * -> *) b c a.
(Vector v b, Vector v c, Vector v (Array v b),
Vector v (Array v c)) =>
(Array v a -> Array v b -> Array v c)
-> Array v a -> Array v b -> Array v c
transmit Array v a -> Array v b -> Array v c
f Array v a
a Array v b
b = [Int] -> (Array v b -> Array v c) -> Array v b -> Array v c
forall (v :: * -> *) a b.
(Vector v a, Vector v b, Vector v (Array v a),
Vector v (Array v b)) =>
[Int] -> (Array v a -> Array v b) -> Array v a -> Array v b
maps [Int]
ds (Array v a -> Array v b -> Array v c
f Array v a
a) Array v b
b
where
ds :: [Int]
ds = [(Array v a -> Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Int
rank Array v a
a) .. (Array v b -> Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Int
rank Array v b
b Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)]
transmitSafe :: (VG.Vector v b, VG.Vector v c, VG.Vector v (Array v b), VG.Vector v (Array v c)) => (Array v a -> Array v b -> Array v c) -> Array v a -> Array v b -> Maybe (Array v c)
transmitSafe :: forall (v :: * -> *) b c a.
(Vector v b, Vector v c, Vector v (Array v b),
Vector v (Array v c)) =>
(Array v a -> Array v b -> Array v c)
-> Array v a -> Array v b -> Maybe (Array v c)
transmitSafe Array v a -> Array v b -> Array v c
f Array v a
a Array v b
b = Maybe (Array v c) -> Maybe (Array v c) -> Bool -> Maybe (Array v c)
forall a. a -> a -> Bool -> a
bool Maybe (Array v c)
forall a. Maybe a
Nothing (Array v c -> Maybe (Array v c)
forall a. a -> Maybe a
Just (Array v c -> Maybe (Array v c)) -> Array v c -> Maybe (Array v c)
forall a b. (a -> b) -> a -> b
$ (Array v a -> Array v b -> Array v c)
-> Array v a -> Array v b -> Array v c
forall (v :: * -> *) b c a.
(Vector v b, Vector v c, Vector v (Array v b),
Vector v (Array v c)) =>
(Array v a -> Array v b -> Array v c)
-> Array v a -> Array v b -> Array v c
transmit Array v a -> Array v b -> Array v c
f Array v a
a Array v b
b) (Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a) [Int] -> [Int] -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`List.isPrefixOf` Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Array v b -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v b
b))
transmitOp :: (VG.Vector v a, VG.Vector v b, VG.Vector v c, VG.Vector v (Array v a), VG.Vector v (Array v b), VG.Vector v (Array v c)) => (a -> b -> c) -> Array v a -> Array v b -> Array v c
transmitOp :: forall (v :: * -> *) a b c.
(Vector v a, Vector v b, Vector v c, Vector v (Array v a),
Vector v (Array v b), Vector v (Array v c)) =>
(a -> b -> c) -> Array v a -> Array v b -> Array v c
transmitOp a -> b -> c
f Array v a
a Array v b
b
| Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a Vector Int -> Vector Int -> Bool
forall a. Eq a => a -> a -> Bool
== Array v b -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v b
b = (a -> b -> c) -> Array v a -> Array v b -> Array v c
forall (v :: * -> *) a b c.
(Vector v a, Vector v b, Vector v c) =>
(a -> b -> c) -> Array v a -> Array v b -> Array v c
zipWith a -> b -> c
f Array v a
a Array v b
b
| Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a) [Int] -> [Int] -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`List.isPrefixOf` Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Array v b -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v b
b) = (Array v a -> Array v b -> Array v c)
-> Array v a -> Array v b -> Array v c
forall (v :: * -> *) b c a.
(Vector v b, Vector v c, Vector v (Array v b),
Vector v (Array v c)) =>
(Array v a -> Array v b -> Array v c)
-> Array v a -> Array v b -> Array v c
transmit ((a -> b -> c) -> Array v a -> Array v b -> Array v c
forall (v :: * -> *) a b c.
(Vector v a, Vector v b, Vector v c) =>
(a -> b -> c) -> Array v a -> Array v b -> Array v c
zipWith a -> b -> c
f) Array v a
a Array v b
b
| Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Array v b -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v b
b) [Int] -> [Int] -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`List.isPrefixOf` Vector Int -> [Int]
forall a. Unbox a => Vector a -> [a]
VU.toList (Array v a -> Vector Int
forall {k} (v :: k -> *) (a :: k). Array v a -> Vector Int
shape Array v a
a) = (Array v b -> Array v a -> Array v c)
-> Array v b -> Array v a -> Array v c
forall (v :: * -> *) b c a.
(Vector v b, Vector v c, Vector v (Array v b),
Vector v (Array v c)) =>
(Array v a -> Array v b -> Array v c)
-> Array v a -> Array v b -> Array v c
transmit ((b -> a -> c) -> Array v b -> Array v a -> Array v c
forall (v :: * -> *) a b c.
(Vector v a, Vector v b, Vector v c) =>
(a -> b -> c) -> Array v a -> Array v b -> Array v c
zipWith ((a -> b -> c) -> b -> a -> c
forall a b c. (a -> b -> c) -> b -> a -> c
flip a -> b -> c
f)) Array v b
b Array v a
a
| Bool
otherwise = String -> Array v c
forall a. HasCallStack => String -> a
error String
"bad shapes"
iota :: (VG.Vector v Int) => Int -> Array v Int
iota :: forall (v :: * -> *). Vector v Int => Int -> Array v Int
iota Int
n = [Int] -> Array v Int
forall (v :: * -> *). Vector v Int => [Int] -> Array v Int
range [Int
n]
cons :: (VG.Vector v a) => Array v a -> Array v a -> Array v a
cons :: forall (v :: * -> *) a.
Vector v a =>
Array v a -> Array v a -> Array v a
cons = Int -> Array v a -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
Int -> Array v a -> Array v a -> Array v a
prepend Int
0
uncons :: (VG.Vector v a) => Array v a -> (Array v a, Array v a)
uncons :: forall (v :: * -> *) a.
Vector v a =>
Array v a -> (Array v a, Array v a)
uncons Array v a
a = ([Int] -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
[Int] -> Array v a -> Array v a
heads [Int
0] Array v a
a', [Int] -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
[Int] -> Array v a -> Array v a
tails [Int
0] Array v a
a')
where
a' :: Array v a
a' = Array v a -> Array v a
forall {k} (v :: k -> *) (a :: k). Array v a -> Array v a
asSingleton Array v a
a
pattern (:<) :: (VG.Vector v a) => Array v a -> Array v a -> Array v a
pattern x $b:< :: forall (v :: * -> *) a.
Vector v a =>
Array v a -> Array v a -> Array v a
$m:< :: forall {r} {v :: * -> *} {a}.
Vector v a =>
Array v a -> (Array v a -> Array v a -> r) -> ((# #) -> r) -> r
:< xs <- (uncons -> (x, xs))
where
Array v a
x :< Array v a
xs = Array v a -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
Array v a -> Array v a -> Array v a
cons Array v a
x Array v a
xs
infix 5 :<
snoc :: (VG.Vector v a) => Array v a -> Array v a -> Array v a
snoc :: forall (v :: * -> *) a.
Vector v a =>
Array v a -> Array v a -> Array v a
snoc = Int -> Array v a -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
Int -> Array v a -> Array v a -> Array v a
append Int
0
unsnoc :: (VG.Vector v a) => Array v a -> (Array v a, Array v a)
unsnoc :: forall (v :: * -> *) a.
Vector v a =>
Array v a -> (Array v a, Array v a)
unsnoc Array v a
a = ([Int] -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
[Int] -> Array v a -> Array v a
inits [Int
0] Array v a
a', [Int] -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
[Int] -> Array v a -> Array v a
lasts [Int
0] Array v a
a')
where
a' :: Array v a
a' = Array v a -> Array v a
forall {k} (v :: k -> *) (a :: k). Array v a -> Array v a
asSingleton Array v a
a
pattern (:>) :: (VG.Vector v a) => Array v a -> Array v a -> Array v a
pattern xs $b:> :: forall (v :: * -> *) a.
Vector v a =>
Array v a -> Array v a -> Array v a
$m:> :: forall {r} {v :: * -> *} {a}.
Vector v a =>
Array v a -> (Array v a -> Array v a -> r) -> ((# #) -> r) -> r
:> x <- (unsnoc -> (xs, x))
where
Array v a
xs :> Array v a
x = Array v a -> Array v a -> Array v a
forall (v :: * -> *) a.
Vector v a =>
Array v a -> Array v a -> Array v a
snoc Array v a
xs Array v a
x
infix 5 :>
uniform :: (StatefulGen g m, UniformRange a, VG.Vector v a) => g -> [Int] -> (a, a) -> m (Array v a)
uniform :: forall g (m :: * -> *) a (v :: * -> *).
(StatefulGen g m, UniformRange a, Vector v a) =>
g -> [Int] -> (a, a) -> m (Array v a)
uniform g
g [Int]
ds (a, a)
r = do
v <- Int -> m a -> m (v a)
forall (m :: * -> *) (v :: * -> *) a.
(Monad m, Vector v a) =>
Int -> m a -> m (v a)
VG.replicateM (Vector Int -> Int
S.size ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
ds)) ((a, a) -> g -> m a
forall a g (m :: * -> *).
(UniformRange a, StatefulGen g m) =>
(a, a) -> g -> m a
forall g (m :: * -> *). StatefulGen g m => (a, a) -> g -> m a
uniformRM (a, a)
r g
g)
pure $ unsafeArray (VU.fromList ds) v