numhask-array-0.3.0.1: n-dimensional arrays

Safe HaskellNone
LanguageHaskell2010

NumHask.Array

Contents

Synopsis

Documentation

>>> :set -XDataKinds
>>> :set -XOverloadedLists
>>> :set -XTypeFamilies
>>> let a = [1..24] :: Array [] '[2,3,4] Int
>>> let v = [1,2,3] :: Array [] '[3] Int

data family Array (c :: Type -> Type) (ds :: [k]) (a :: Type) Source #

an array polymorphic in container and shape

>>> a
[[[1, 2, 3, 4],
  [5, 6, 7, 8],
  [9, 10, 11, 12]],
 [[13, 14, 15, 16],
  [17, 18, 19, 20],
  [21, 22, 23, 24]]]
Instances
Functor c => Functor (Array c ds) Source # 
Instance details

Defined in NumHask.Array

Methods

fmap :: (a -> b) -> Array c ds a -> Array c ds b #

(<$) :: a -> Array c ds b -> Array c ds a #

Foldable c => Foldable (Array c ds) Source # 
Instance details

Defined in NumHask.Array

Methods

fold :: Monoid m => Array c ds m -> m #

foldMap :: Monoid m => (a -> m) -> Array c ds a -> m #

foldr :: (a -> b -> b) -> b -> Array c ds a -> b #

foldr' :: (a -> b -> b) -> b -> Array c ds a -> b #

foldl :: (b -> a -> b) -> b -> Array c ds a -> b #

foldl' :: (b -> a -> b) -> b -> Array c ds a -> b #

foldr1 :: (a -> a -> a) -> Array c ds a -> a #

foldl1 :: (a -> a -> a) -> Array c ds a -> a #

toList :: Array c ds a -> [a] #

null :: Array c ds a -> Bool #

length :: Array c ds a -> Int #

elem :: Eq a => a -> Array c ds a -> Bool #

maximum :: Ord a => Array c ds a -> a #

minimum :: Ord a => Array c ds a -> a #

sum :: Num a => Array c ds a -> a #

product :: Num a => Array c ds a -> a #

(Dimensions r, Container c) => Distributive (Array c r) Source # 
Instance details

Defined in NumHask.Array

Methods

distribute :: Functor f => f (Array c r a) -> Array c r (f a) #

collect :: Functor f => (a -> Array c r b) -> f a -> Array c r (f b) #

distributeM :: Monad m => m (Array c r a) -> Array c r (m a) #

collectM :: Monad m => (a -> Array c r b) -> m a -> Array c r (m b) #

(Dimensions r, Container c) => Representable (Array c r) Source # 
Instance details

Defined in NumHask.Array

Associated Types

type Rep (Array c r) :: Type #

Methods

tabulate :: (Rep (Array c r) -> a) -> Array c r a #

index :: Array c r a -> Rep (Array c r) -> a #

Dimensions r => HasShape (Array c r) Source # 
Instance details

Defined in NumHask.Array

Associated Types

type Shape (Array c r) :: Type Source #

Methods

shape :: Array c r a -> Shape (Array c r) Source #

(Dimensions r, Container c, Multiplicative a) => HadamardMultiplication (Array c r) a Source # 
Instance details

Defined in NumHask.Array

Methods

(.*.) :: Array c r a -> Array c r a -> Array c r a #

(Dimensions r, Container c, Divisive a) => HadamardDivision (Array c r) a Source # 
Instance details

Defined in NumHask.Array

Methods

(./.) :: Array c r a -> Array c r a -> Array c r a #

(Item (Array c r a) ~ Item (c a), Dimensions r, Additive a, IsList (c a)) => IsList (Array c r a) Source #

from flat list

Instance details

Defined in NumHask.Array

Associated Types

type Item (Array c r a) :: Type #

Methods

fromList :: [Item (Array c r a)] -> Array c r a #

fromListN :: Int -> [Item (Array c r a)] -> Array c r a #

toList :: Array c r a -> [Item (Array c r a)] #

(Eq (c t), Dimensions ds) => Eq (Array c ds t) Source # 
Instance details

Defined in NumHask.Array

Methods

(==) :: Array c ds t -> Array c ds t -> Bool #

(/=) :: Array c ds t -> Array c ds t -> Bool #

(Show a, Show (Item (c a)), IsList (c a), Container c, Dimensions ds) => Show (Array c ds a) Source # 
Instance details

Defined in NumHask.Array

Methods

showsPrec :: Int -> Array c ds a -> ShowS #

show :: Array c ds a -> String #

showList :: [Array c ds a] -> ShowS #

NFData (Array c ds t) Source # 
Instance details

Defined in NumHask.Array

Methods

rnf :: Array c ds t -> () #

(Actor (Array c r a) ~ a, Foldable (Array c r), Distributive a, CommutativeRing a, Semiring a, Dimensions r, Container c) => Hilbert (Array c r a) Source # 
Instance details

Defined in NumHask.Array

Methods

(<.>) :: Array c r a -> Array c r a -> Actor (Array c r a) #

(Dimensions r, Container c, Multiplicative a, Signed a) => Signed (Array c r a) Source # 
Instance details

Defined in NumHask.Array

Methods

sign :: Array c r a -> Array c r a #

abs :: Array c r a -> Array c r a #

(Eq (c a), Foldable (Array c r), Dimensions r, Container c, Epsilon a) => Epsilon (Array c r a) Source # 
Instance details

Defined in NumHask.Array

Methods

epsilon :: Array c r a #

nearZero :: Array c r a -> Bool #

aboutEqual :: Array c r a -> Array c r a -> Bool #

(Eq (c a), Container c, Dimensions r, JoinSemiLattice a) => JoinSemiLattice (Array c r a) Source # 
Instance details

Defined in NumHask.Array

Methods

(\/) :: Array c r a -> Array c r a -> Array c r a #

(Eq (c a), Container c, Dimensions r, MeetSemiLattice a) => MeetSemiLattice (Array c r a) Source # 
Instance details

Defined in NumHask.Array

Methods

(/\) :: Array c r a -> Array c r a -> Array c r a #

(Eq (c a), Container c, Dimensions r, BoundedJoinSemiLattice a) => BoundedJoinSemiLattice (Array c r a) Source # 
Instance details

Defined in NumHask.Array

Methods

bottom :: Array c r a #

(Eq (c a), Container c, Dimensions r, BoundedMeetSemiLattice a) => BoundedMeetSemiLattice (Array c r a) Source # 
Instance details

Defined in NumHask.Array

Methods

top :: Array c r a #

(Dimensions r, Container c, Field a) => Field (Array c r a) Source # 
Instance details

Defined in NumHask.Array

(Dimensions r, Container c, ExpField a) => ExpField (Array c r a) Source # 
Instance details

Defined in NumHask.Array

Methods

exp :: Array c r a -> Array c r a #

log :: Array c r a -> Array c r a #

logBase :: Array c r a -> Array c r a -> Array c r a #

(**) :: Array c r a -> Array c r a -> Array c r a #

sqrt :: Array c r a -> Array c r a #

(Foldable (Array c r), Dimensions r, Container c, UpperBoundedField a) => UpperBoundedField (Array c r a) Source # 
Instance details

Defined in NumHask.Array

Methods

infinity :: Array c r a #

nan :: Array c r a #

isNaN :: Array c r a -> Bool #

(Foldable (Array c r), Dimensions r, Container c, LowerBoundedField a) => LowerBoundedField (Array c r a) Source # 
Instance details

Defined in NumHask.Array

Methods

negInfinity :: Array c r a #

(Dimensions r, Container c, Integral a) => Integral (Array c r a) Source # 
Instance details

Defined in NumHask.Array

Methods

div :: Array c r a -> Array c r a -> Array c r a #

mod :: Array c r a -> Array c r a -> Array c r a #

divMod :: Array c r a -> Array c r a -> (Array c r a, Array c r a) #

quot :: Array c r a -> Array c r a -> Array c r a #

rem :: Array c r a -> Array c r a -> Array c r a #

quotRem :: Array c r a -> Array c r a -> (Array c r a, Array c r a) #

(Foldable (Array c r), Dimensions r, Container c, CommutativeRing a, Multiplicative a) => TensorProduct (Array c r a) Source # 
Instance details

Defined in NumHask.Array

Methods

(><) :: Array c r a -> Array c r a -> Array c r a >< Array c r a #

outer :: Array c r a -> Array c r a -> Array c r a >< Array c r a #

timesleft :: Array c r a -> (Array c r a >< Array c r a) -> Array c r a #

timesright :: (Array c r a >< Array c r a) -> Array c r a -> Array c r a #

(Dimensions r, Container c, Multiplicative a, Additive a) => Distributive (Array c r a) Source # 
Instance details

Defined in NumHask.Array

(Dimensions r, Container c, IntegralDomain a) => IntegralDomain (Array c r a) Source # 
Instance details

Defined in NumHask.Array

(Dimensions r, Container c, Additive a) => AdditiveAction (Array c r a) Source # 
Instance details

Defined in NumHask.Array

Methods

(.+) :: Array c r a -> Actor (Array c r a) -> Array c r a #

(+.) :: Actor (Array c r a) -> Array c r a -> Array c r a #

(Dimensions r, Container c, Subtractive a) => SubtractiveAction (Array c r a) Source # 
Instance details

Defined in NumHask.Array

Methods

(.-) :: Array c r a -> Actor (Array c r a) -> Array c r a #

(-.) :: Actor (Array c r a) -> Array c r a -> Array c r a #

(Dimensions r, Container c, Multiplicative a) => MultiplicativeAction (Array c r a) Source # 
Instance details

Defined in NumHask.Array

Methods

(.*) :: Array c r a -> Actor (Array c r a) -> Array c r a #

(*.) :: Actor (Array c r a) -> Array c r a -> Array c r a #

(Dimensions r, Container c, Divisive a) => DivisiveAction (Array c r a) Source # 
Instance details

Defined in NumHask.Array

Methods

(./) :: Array c r a -> Actor (Array c r a) -> Array c r a #

(/.) :: Actor (Array c r a) -> Array c r a -> Array c r a #

(Dimensions r, Container c, Multiplicative a) => Multiplicative (Array c r a) Source # 
Instance details

Defined in NumHask.Array

Methods

(*) :: Array c r a -> Array c r a -> Array c r a #

one :: Array c r a #

(Dimensions r, Container c, Divisive a) => Divisive (Array c r a) Source # 
Instance details

Defined in NumHask.Array

Methods

recip :: Array c r a -> Array c r a #

(/) :: Array c r a -> Array c r a -> Array c r a #

(Dimensions r, Container c, Additive a) => Additive (Array c r a) Source # 
Instance details

Defined in NumHask.Array

Methods

(+) :: Array c r a -> Array c r a -> Array c r a #

zero :: Array c r a #

(Dimensions r, Container c, Subtractive a) => Subtractive (Array c r a) Source # 
Instance details

Defined in NumHask.Array

Methods

negate :: Array c r a -> Array c r a #

(-) :: Array c r a -> Array c r a -> Array c r a #

(Functor (Array c r), Foldable (Array c r), Additive (Array c r a), Normed a a, ExpField a) => Normed (Array c r a) a Source # 
Instance details

Defined in NumHask.Array

Methods

normL1 :: Array c r a -> a #

normL2 :: Array c r a -> a #

(Foldable (Array c r), Dimensions r, Container c, ExpField a, Subtractive a, Normed a a) => Metric (Array c r a) a Source # 
Instance details

Defined in NumHask.Array

Methods

distanceL1 :: Array c r a -> Array c r a -> a #

distanceL2 :: Array c r a -> Array c r a -> a #

newtype Array c (ds :: [Nat]) t Source #

instance where dimensions are known at compile time

Instance details

Defined in NumHask.Array

newtype Array c (ds :: [Nat]) t = Array {}
type Rep (Array c r) Source # 
Instance details

Defined in NumHask.Array

type Rep (Array c r) = [Int]
type Shape (Array c r) Source # 
Instance details

Defined in NumHask.Array

type Shape (Array c r) = [Int]
type Item (Array c r a) Source # 
Instance details

Defined in NumHask.Array

type Item (Array c r a) = a
type Actor (Array c r a) Source # 
Instance details

Defined in NumHask.Array

type Actor (Array c r a) = a

newtype AnyArray c a Source #

an array with dimensions represented at the value level

Constructors

AnyArray ([Int], c a) 
Instances
(Show a, Show (Item (c a)), Container c, IsList (c a)) => Show (AnyArray c a) Source # 
Instance details

Defined in NumHask.Array

Methods

showsPrec :: Int -> AnyArray c a -> ShowS #

show :: AnyArray c a -> String #

showList :: [AnyArray c a] -> ShowS #

anyArray :: Dimensions ds => Array c (ds :: [Nat]) a -> AnyArray c a Source #

convert an array with type-level shape to value-level shape

class Functor f => Container f where Source #

a sweet class of container with attributes necessary to supply the set of operations here

Methods

generate :: Int -> (Int -> a) -> f a Source #

idx :: f a -> Int -> a Source #

cslice :: Int -> Int -> f a -> f a Source #

zipWith :: (a -> a -> a) -> f a -> f a -> f a Source #

chunkItUp :: [f a] -> Int -> f a -> [f a] Source #

cfoldl' :: (b -> a -> b) -> b -> f a -> b Source #

cfoldr :: (a -> b -> b) -> b -> f a -> b Source #

cconcat :: [f a] -> f a Source #

Instances
Container [] Source # 
Instance details

Defined in NumHask.Array

Methods

generate :: Int -> (Int -> a) -> [a] Source #

idx :: [a] -> Int -> a Source #

cslice :: Int -> Int -> [a] -> [a] Source #

zipWith :: (a -> a -> a) -> [a] -> [a] -> [a] Source #

chunkItUp :: [[a]] -> Int -> [a] -> [[a]] Source #

cfoldl' :: (b -> a -> b) -> b -> [a] -> b Source #

cfoldr :: (a -> b -> b) -> b -> [a] -> b Source #

cconcat :: [[a]] -> [a] Source #

Container Vector Source # 
Instance details

Defined in NumHask.Array

Methods

generate :: Int -> (Int -> a) -> Vector a Source #

idx :: Vector a -> Int -> a Source #

cslice :: Int -> Int -> Vector a -> Vector a Source #

zipWith :: (a -> a -> a) -> Vector a -> Vector a -> Vector a Source #

chunkItUp :: [Vector a] -> Int -> Vector a -> [Vector a] Source #

cfoldl' :: (b -> a -> b) -> b -> Vector a -> b Source #

cfoldr :: (a -> b -> b) -> b -> Vector a -> b Source #

cconcat :: [Vector a] -> Vector a Source #

shape helpers where dimensions ~ [Int]

ind :: [Int] -> [Int] -> Int Source #

convert from n-dim shape index to a flat index

>>> ind [2,3,4] [1,1,1]
17

unind :: [Int] -> Int -> [Int] Source #

convert from a flat index to a shape index

>>> unind [2,3,4] 17
[1,1,1]

flatten1 :: Container c => AnyArray c a -> [AnyArray c a] Source #

convert the top layer of a SomeArray to a [SomeArray]

type Vector c n = Array c '[n] Source #

type Matrix c m n = Array c '[m, n] Source #

Operations

(><) :: forall c (r :: [Nat]) (s :: [Nat]) a. (Container c, CommutativeRing a, Dimensions r, Dimensions s, Dimensions ((++) r s)) => Array c r a -> Array c s a -> Array c ((++) r s) a Source #

outer product

todo: reconcile with numhask version

>>> v NumHask.Array.>< v
[[1, 2, 3],
 [2, 4, 6],
 [3, 6, 9]]

mmult :: forall c m n k a. (Hilbert (Vector c k a), Dimensions '[m, k], Dimensions '[k, n], Dimensions '[m, n], Container c) => Matrix c (m :: Nat) (k :: Nat) a -> Matrix c k n a -> Matrix c m n a Source #

matrix multiplication

>>> let a = [1, 2, 3, 4] :: Array [] '[2, 2] Int
>>> let b = [5, 6, 7, 8] :: Array [] '[2, 2] Int
>>> a
[[1, 2],
 [3, 4]]
>>> b
[[5, 6],
 [7, 8]]
>>> mmult a b
[[19, 22],
 [43, 50]]

row :: forall c i a m n. (Dimensions '[m, n], Container c, KnownNat i, (<) i m ~ True) => Proxy i -> Matrix c m n a -> Vector c n a Source #

extract the row of a matrix

rank2Shape :: Dimensions '[m, n] => Matrix c (m :: Nat) (n :: Nat) a -> (Int, Int) Source #

unsafeRow :: forall c a m n. (Container c, Dimensions '[m, n]) => Int -> Matrix c (m :: Nat) (n :: Nat) a -> Vector c n a Source #

unsafeCol :: forall c a m n. (Container c, Dimensions '[m, n]) => Int -> Matrix c (m :: Nat) (n :: Nat) a -> Vector c m a Source #

col :: forall c j a m n. (Dimensions '[m, n], Container c, KnownNat j, (<) j n ~ True) => Proxy j -> Matrix c m n a -> Vector c m a Source #

extract the column of a matrix

unsafeIndex :: (Container c, Dimensions r) => Array c (r :: [Nat]) a -> [Int] -> a Source #

>>> unsafeIndex a [0,2,1]
10

unsafeSlice :: (Container c, IsList (c a), Item (c a) ~ a, Dimensions r, Dimensions r0) => [[Int]] -> Array c (r :: [Nat]) a -> Array c (r0 :: [Nat]) a Source #

>>> unsafeSlice [[0,1],[2],[1,2]] a :: Array [] '[2,1,2] Int
[[[10, 11]],
 [[22, 23]]]

slice :: (SingKind a1, SingI a2, Container c, IsList (c a3), Dimensions r, Dimensions r0, Item (c a3) ~# a3, Demote a1 ~# Integer) => proxy a2 -> Array c r a3 -> Array c r0 a3 Source #

todo: an ambiguous type variable has snuck in here somewhere

slice (Proxy :: Proxy '[ '[0,1],'[2],'[1,2]]) a
[[10, 11
],
[22, 23
]]

foldAlong :: forall c s vw uvw uw w a. (Container c, KnownNat s, Dimensions uvw, uw ~ Fold s uvw, w ~ Drop 1 vw, vw ~ TailModule s uvw) => Proxy s -> (Array c vw a -> Array c w a) -> Array c uvw a -> Array c uw a Source #

>>> foldAlong (Proxy :: Proxy 1) (\_ -> ([0..3] :: Array [] '[4] Int)) a
[[0, 1, 2, 3],
 [0, 1, 2, 3]]

todo: resolution of a primitive and a scalar eg Expected type: Array '[10] Int -> Array '[] Int Actual type: Array '[10] (Array '[] Int) -> Array '[] Int

mapAlong :: forall c s uvw vw a. (Container c, KnownNat s, Dimensions uvw, vw ~ HeadModule s uvw) => Proxy s -> (Array c vw a -> Array c vw a) -> Array c uvw a -> Array c uvw a Source #

todo: No instance for (Container (Array [] '[]) error

mapAlong (Proxy :: Proxy 0) (\x -> NumHask.Array.zipWith (*) x x) a
[[1, 4, 9, 16
,
25, 36, 49, 64
,
81, 100, 121, 144
],
[169, 196, 225, 256
,
289, 324, 361, 400
,
441, 484, 529, 576
]]

concatenate :: forall c s r t a. (Container c, SingI s, Dimensions r, Dimensions t, IsValidConcat s t r ~ True) => Proxy s -> Array c r a -> Array c t a -> Array c (Concatenate s t r) a Source #

>>> concatenate (Proxy :: Proxy 2) a a
[[[1, 2, 3, 4, 1, 2, 3, 4],
  [5, 6, 7, 8, 5, 6, 7, 8],
  [9, 10, 11, 12, 9, 10, 11, 12]],
 [[13, 14, 15, 16, 13, 14, 15, 16],
  [17, 18, 19, 20, 17, 18, 19, 20],
  [21, 22, 23, 24, 21, 22, 23, 24]]]

transpose :: forall c s t a. (t ~ Transpose s, Container c, Dimensions s, Dimensions t) => Array c (s :: [Nat]) a -> Array c (t :: [Nat]) a Source #

>>> NumHask.Array.transpose a
[[[1, 2],
  [3, 4],
  [5, 6]],
 [[7, 8],
  [9, 10],
  [11, 12]],
 [[13, 14],
  [15, 16],
  [17, 18]],
 [[19, 20],
  [21, 22],
  [23, 24]]]

squeeze :: forall c s t a. t ~ Squeeze s => Array c s a -> Array c t a Source #

>>> let a = [1..24] :: Array [] '[2,1,3,4,1] Int
>>> a
[[[[[1],
    [2],
    [3],
    [4]],
   [[5],
    [6],
    [7],
    [8]],
   [[9],
    [10],
    [11],
    [12]]]],
 [[[[13],
    [14],
    [15],
    [16]],
   [[17],
    [18],
    [19],
    [20]],
   [[21],
    [22],
    [23],
    [24]]]]]
>>> squeeze a
[[[1, 2, 3, 4],
  [5, 6, 7, 8],
  [9, 10, 11, 12]],
 [[13, 14, 15, 16],
  [17, 18, 19, 20],
  [21, 22, 23, 24]]]

singleton :: (Dimensions r, Container c) => a -> Array c (r :: [Nat]) a Source #