-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | Initial project template from stack
--
-- Pure haskell vectormatrixtensor library. Features
-- dimensionality type-checking for all operations. Generic n-dimensional
-- versions are implemented using low-level prim ops. Allows ad-hoc
-- replacement with fixed low-dimensionality vectors and matrices without
-- changing user interface.
@package easytensor
@version 0.2.0.0
module Numeric.Commons
-- | Facilities to convert to and from raw byte array. Warning! offsets and
-- sizes are in elements, not in bytes! Therefore one must be really
-- carefull if having a crazy idea of converting between types of
-- different element sizes.
class PrimBytes (a :: Type)
-- | Store content of a data type in a primitive byte array (ElementOffset,
-- NumberOfElements, ByteArrayContent )
toBytes :: PrimBytes a => a -> (# Int#, Int#, ByteArray# #)
-- | Load content of a data type from a primitive byte array
-- (ElementOffset, NumberOfElements, ByteArrayContent )
fromBytes :: PrimBytes a => (# Int#, Int#, ByteArray# #) -> a
-- | Size of a data type in bytes
byteSize :: PrimBytes a => a -> Int#
-- | Alignment of a data type in bytes
byteAlign :: PrimBytes a => a -> Int#
-- | Size of a conainer type elements in bytes
elementByteSize :: PrimBytes a => a -> Int#
-- | Primitive indexing
ix :: PrimBytes a => Int# -> a -> (ElemPrim a :: TYPE (ElemRep a))
type FloatBytes a = (PrimBytes a, ElemRep a ~ FloatRep, ElemPrim a ~ Float#)
type DoubleBytes a = (PrimBytes a, ElemRep a ~ DoubleRep, ElemPrim a ~ Double#)
type IntBytes a = (PrimBytes a, ElemRep a ~ IntRep, ElemPrim a ~ Int#)
type WordBytes a = (PrimBytes a, ElemRep a ~ WordRep, ElemPrim a ~ Word#)
instance Numeric.Commons.PrimBytes GHC.Types.Float
instance Numeric.Commons.PrimBytes GHC.Types.Double
instance Numeric.Commons.PrimBytes GHC.Types.Int
instance Numeric.Commons.PrimBytes GHC.Int.Int8
instance Numeric.Commons.PrimBytes GHC.Int.Int16
instance Numeric.Commons.PrimBytes GHC.Int.Int32
instance Numeric.Commons.PrimBytes GHC.Int.Int64
instance Numeric.Commons.PrimBytes GHC.Types.Word
instance Numeric.Commons.PrimBytes GHC.Word.Word8
instance Numeric.Commons.PrimBytes GHC.Word.Word16
instance Numeric.Commons.PrimBytes GHC.Word.Word32
instance Numeric.Commons.PrimBytes GHC.Word.Word64
module Numeric.Scalar
-- | Alias for zero-dimensional DataFrame
type Scalar t = DataFrame t ('[] :: [Nat])
-- | Convert scalar back to ordinary type
unScalar :: Scalar t -> t
-- | Convert any type to scalar wrapper
scalar :: t -> Scalar t
type Scf = Scalar Float
type Scd = Scalar Double
-- | Mutable DataFrames living in IO.
module Numeric.DataFrame.IO
class MutableFrame t (ns :: [Nat])
-- | Mutable DataFrame that lives in IO. Internal representation is always
-- a ByteArray.
data IODataFrame t (ns :: [Nat])
-- | Create a new mutable DataFrame.
newDataFrame :: forall t (ns :: [Nat]). (PrimBytes t, Dimensions ns) => IO (IODataFrame t ns)
-- | Copy one DataFrame into another mutable DataFrame at specified
-- position.
copyDataFrame :: forall t (as :: [Nat]) (bs :: [Nat]) (asbs :: [Nat]). (PrimBytes (DataFrame t as), ConcatList as bs asbs, Dimensions bs) => DataFrame t as -> Idx bs -> IODataFrame t asbs -> IO ()
-- | Copy one mutable DataFrame into another mutable DataFrame at specified
-- position.
copyMutableDataFrame :: forall t (as :: [Nat]) (bs :: [Nat]) (asbs :: [Nat]). (PrimBytes t, ConcatList as bs asbs, Dimensions bs) => IODataFrame t as -> Idx bs -> IODataFrame t asbs -> IO ()
-- | Make a mutable DataFrame immutable, without copying.
unsafeFreezeDataFrame :: forall t (ns :: [Nat]). PrimBytes (DataFrame t ns) => IODataFrame t ns -> IO (DataFrame t ns)
-- | Copy content of a mutable DataFrame into a new immutable DataFrame.
freezeDataFrame :: forall t (ns :: [Nat]). PrimBytes (DataFrame t ns) => IODataFrame t ns -> IO (DataFrame t ns)
-- | Create a new mutable DataFrame and copy content of immutable one in
-- there.
thawDataFrame :: forall t (ns :: [Nat]). PrimBytes (DataFrame t ns) => DataFrame t ns -> IO (IODataFrame t ns)
-- | Write a single element at the specified index
writeDataFrame :: forall t (ns :: [Nat]). (MutableFrame t ns, Dimensions ns) => IODataFrame t ns -> Idx ns -> Scalar t -> IO ()
-- | Read a single element at the specified index
readDataFrame :: forall t (ns :: [Nat]). (MutableFrame t ns, Dimensions ns) => IODataFrame t ns -> Idx ns -> IO (Scalar t)
-- | Write a single element at the specified element offset
writeDataFrameOff :: forall t (ns :: [Nat]). (MutableFrame t ns, Dimensions ns) => IODataFrame t ns -> Int -> Scalar t -> IO ()
-- | Read a single element at the specified element offset
readDataFrameOff :: forall t (ns :: [Nat]). (MutableFrame t ns, Dimensions ns) => IODataFrame t ns -> Int -> IO (Scalar t)
-- | Mutable DataFrames living in ST.
module Numeric.DataFrame.ST
class MutableFrame t (ns :: [Nat])
-- | Mutable DataFrame that lives in ST. Internal representation is always
-- a ByteArray.
data STDataFrame s t (ns :: [Nat])
-- | Create a new mutable DataFrame.
newDataFrame :: forall t (ns :: [Nat]) s. (PrimBytes t, Dimensions ns) => ST s (STDataFrame s t ns)
-- | Copy one DataFrame into another mutable DataFrame at specified
-- position.
copyDataFrame :: forall t (as :: [Nat]) (bs :: [Nat]) (asbs :: [Nat]) s. (PrimBytes (DataFrame t as), ConcatList as bs asbs, Dimensions bs) => DataFrame t as -> Idx bs -> STDataFrame s t asbs -> ST s ()
-- | Copy one mutable DataFrame into another mutable DataFrame at specified
-- position.
copyMutableDataFrame :: forall t (as :: [Nat]) (bs :: [Nat]) (asbs :: [Nat]) s. (PrimBytes t, ConcatList as bs asbs, Dimensions bs) => STDataFrame s t as -> Idx bs -> STDataFrame s t asbs -> ST s ()
-- | Make a mutable DataFrame immutable, without copying.
unsafeFreezeDataFrame :: forall t (ns :: [Nat]) s. PrimBytes (DataFrame t ns) => STDataFrame s t ns -> ST s (DataFrame t ns)
-- | Copy content of a mutable DataFrame into a new immutable DataFrame.
freezeDataFrame :: forall t (ns :: [Nat]) s. PrimBytes (DataFrame t ns) => STDataFrame s t ns -> ST s (DataFrame t ns)
-- | Create a new mutable DataFrame and copy content of immutable one in
-- there.
thawDataFrame :: forall t (ns :: [Nat]) s. PrimBytes (DataFrame t ns) => DataFrame t ns -> ST s (STDataFrame s t ns)
-- | Write a single element at the specified index
writeDataFrame :: forall t (ns :: [Nat]) s. (MutableFrame t ns, Dimensions ns) => STDataFrame s t ns -> Idx ns -> Scalar t -> ST s ()
-- | Read a single element at the specified index
readDataFrame :: forall t (ns :: [Nat]) s. (MutableFrame t ns, Dimensions ns) => STDataFrame s t ns -> Idx ns -> ST s (Scalar t)
-- | Write a single element at the specified element offset
writeDataFrameOff :: forall t (ns :: [Nat]) s. (MutableFrame t ns, Dimensions ns) => STDataFrame s t ns -> Int -> Scalar t -> ST s ()
-- | Read a single element at the specified element offset
readDataFrameOff :: forall t (ns :: [Nat]) s. (MutableFrame t ns, Dimensions ns) => STDataFrame s t ns -> Int -> ST s (Scalar t)
module Numeric.Vector
type Vector t (n :: Nat) = DataFrame t '[n]
type Vec2f = Vector Float 2
type Vec3f = Vector Float 3
type Vec4f = Vector Float 4
type Vec2d = Vector Double 2
type Vec3d = Vector Double 3
type Vec4d = Vector Double 4
-- | Scalar product -- sum of Vecs' components products, propagated into
-- whole Vec
(.*.) :: (Num t, Num (Vector t n), ElementWise (Idx '[n]) t (Vector t n)) => Vector t n -> Vector t n -> Vector t n
infixl 7 .*.
-- | Scalar product -- sum of Vecs' components products -- a scalar
dot :: (Num t, Num (Vector t n), ElementWise (Idx '[n]) t (Vector t n)) => Vector t n -> Vector t n -> Scalar t
-- | Dot product of two vectors
(·) :: (Num t, Num (Vector t n), ElementWise (Idx '[n]) t (Vector t n)) => Vector t n -> Vector t n -> Scalar t
infixl 7 `·`
-- | Sum of absolute values
normL1 :: (Num t, ElementWise (Idx '[n]) t (Vector t n)) => Vector t n -> Scalar t
-- | hypot function (square root of squares)
normL2 :: (Floating t, ElementWise (Idx '[n]) t (Vector t n)) => Vector t n -> Scalar t
-- | Maximum of absolute values
normLPInf :: (Ord t, Num t, ElementWise (Idx '[n]) t (Vector t n)) => Vector t n -> Scalar t
-- | Minimum of absolute values
normLNInf :: (Ord t, Num t, ElementWise (Idx '[n]) t (Vector t n)) => Vector t n -> Scalar t
-- | Norm in Lp space
normLP :: (Floating t, ElementWise (Idx '[n]) t (Vector t n)) => Int -> Vector t n -> Scalar t
-- | Compose a 2D vector
vec2 :: ElementWise (Idx '[2]) t (Vector t 2) => t -> t -> Vector t 2
-- | Compose a 3D vector
vec3 :: ElementWise (Idx '[3]) t (Vector t 3) => t -> t -> t -> Vector t 3
-- | Compose a 3D vector
vec4 :: ElementWise (Idx '[4]) t (Vector t 4) => t -> t -> t -> t -> Vector t 4
-- | Take a determinant of a matrix composed from two 2D vectors. Like a
-- cross product in 2D.
det2 :: (ElementWise (Idx '[2]) t (Vector t 2), Num t) => Vector t 2 -> Vector t 2 -> Scalar t
-- | Cross product
cross :: (ElementWise (Idx '[3]) t (Vector t 3), Num t) => Vector t 3 -> Vector t 3 -> Vector t 3
-- | Cross product for two vectors in 3D
(×) :: (ElementWise (Idx '[3]) t (Vector t 3), Num t) => Vector t 3 -> Vector t 3 -> Vector t 3
infixl 7 ×
module Numeric.Matrix
class MatrixCalculus t (n :: Nat) (m :: Nat)
-- | Transpose Mat
transpose :: (MatrixCalculus t n m, MatrixCalculus t m n, PrimBytes (Matrix t m n)) => Matrix t n m -> Matrix t m n
class SquareMatrixCalculus t (n :: Nat)
-- | Mat with 1 on diagonal and 0 elsewhere
eye :: SquareMatrixCalculus t n => Matrix t n n
-- | Put the same value on the Mat diagonal, 0 otherwise
diag :: SquareMatrixCalculus t n => Scalar t -> Matrix t n n
-- | Determinant of Mat
det :: SquareMatrixCalculus t n => Matrix t n n -> t
-- | Sum of diagonal elements
trace :: SquareMatrixCalculus t n => Matrix t n n -> Scalar t
class MatrixInverse t (n :: Nat)
-- | Matrix inverse
inverse :: MatrixInverse t n => DataFrame t '[n, n] -> DataFrame t '[n, n]
-- | Alias for DataFrames of rank 2
type Matrix t (n :: Nat) (m :: Nat) = DataFrame t '[n, m]
type Mat22f = Matrix Float 2 2
type Mat23f = Matrix Float 2 3
type Mat24f = Matrix Float 2 4
type Mat32f = Matrix Float 3 2
type Mat33f = Matrix Float 3 3
type Mat34f = Matrix Float 3 4
type Mat42f = Matrix Float 4 2
type Mat43f = Matrix Float 4 3
type Mat44f = Matrix Float 4 4
-- | Compose a 2x2D matrix
mat22 :: (PrimBytes (Vector t 2), PrimBytes (Matrix t 2 2)) => Vector t 2 -> Vector t 2 -> Matrix t 2 2
-- | Compose a 3x3D matrix
mat33 :: (PrimBytes t, PrimBytes (Vector t 3), PrimBytes (Matrix t 3 3)) => Vector t 3 -> Vector t 3 -> Vector t 3 -> Matrix t 3 3
-- | Compose a 4x4D matrix
mat44 :: forall (t :: Type). (PrimBytes t, PrimBytes (Vector t (4 :: Nat)), PrimBytes (Matrix t (4 :: Nat) (4 :: Nat))) => Vector t (4 :: Nat) -> Vector t (4 :: Nat) -> Vector t (4 :: Nat) -> Vector t (4 :: Nat) -> Matrix t (4 :: Nat) (4 :: Nat)
-- | Tensor contraction. In particular: 1. matrix-matrix product 2.
-- matrix-vector or vector-matrix product 3. dot product of two vectors.
(%*) :: (ConcatList as bs (as ++ bs), Contraction t as bs asbs, KnownDim m, PrimBytes (DataFrame t (as +: m)), PrimBytes (DataFrame t (m :+ bs)), PrimBytes (DataFrame t (as ++ bs))) => DataFrame t (as +: m) -> DataFrame t (m :+ bs) -> DataFrame t (as ++ bs)
infixl 7 %*
module Numeric.DataFrame
-- | Keep data in a primitive data frame and maintain information about
-- Dimensions in the type-system
-- | Allow all numeric operations depending on element type
type NumericFrame t ds = (CommonOpFrame t ds, NumericVariantFrame t ds)
-- | Allow floating-point operations on data frames
type FPFRame t ds = (Fractional (DataFrame t ds), Floating (DataFrame t ds))
-- | Allow some integer-like operations on data frames
type IntegralFrame t (ds :: [Nat]) = Bounded (DataFrame t ds)
-- | Allow all common operations on data frames
type CommonOpFrame t ds = (Show (DataFrame t ds), Eq (DataFrame t ds), Ord (DataFrame t ds), Num (DataFrame t ds), ElementWise (Idx ds) t (DataFrame t ds), PrimBytes (DataFrame t ds), ArrayInstanceInference t ds, KnownDims ds, FiniteList ds, Dimensions ds)
-- | Operations on DataFrames as is an element dimensionality bs is an
-- indexing dimensionality t is an underlying data type (i.e. Float, Int,
-- Double)
class (ConcatList as bs asbs, Dimensions as, Dimensions bs, Dimensions asbs) => SubSpace (t :: Type) (as :: [Nat]) (bs :: [Nat]) (asbs :: [Nat]) | asbs as -> bs, asbs bs -> as, as bs -> asbs
-- | Get an element
(!.) :: SubSpace t as bs asbs => Idx bs -> DataFrame t asbs -> DataFrame t as
-- | Set a new value to an element
update :: SubSpace t as bs asbs => Idx bs -> DataFrame t as -> DataFrame t asbs -> DataFrame t asbs
-- | Map a function over each element of DataFrame
ewmap :: forall s (as' :: [Nat]) (asbs' :: [Nat]). (SubSpace t as bs asbs, SubSpace s as' bs asbs') => (DataFrame s as' -> DataFrame t as) -> DataFrame s asbs' -> DataFrame t asbs
-- | Map a function over each element with its index of DataFrame
iwmap :: forall s (as' :: [Nat]) (asbs' :: [Nat]). (SubSpace t as bs asbs, SubSpace s as' bs asbs') => (Idx bs -> DataFrame s as' -> DataFrame t as) -> DataFrame s asbs' -> DataFrame t asbs
-- | Generate a DataFrame by repeating an element
ewgen :: SubSpace t as bs asbs => DataFrame t as -> DataFrame t asbs
-- | Generate a DataFrame by iterating a function (index -> element)
iwgen :: SubSpace t as bs asbs => (Idx bs -> DataFrame t as) -> DataFrame t asbs
-- | Left-associative fold of a DataFrame. The fold is strict, so
-- accumulater is evaluated to WHNF; but you'd better make sure that the
-- function is strict enough to not produce memory leaks deeply inside
-- the result data type.
ewfoldl :: SubSpace t as bs asbs => (b -> DataFrame t as -> b) -> b -> DataFrame t asbs -> b
-- | Left-associative fold of a DataFrame with an index The fold is strict,
-- so accumulater is evaluated to WHNF; but you'd better make sure that
-- the function is strict enough to not produce memory leaks deeply
-- inside the result data type.
iwfoldl :: SubSpace t as bs asbs => (Idx bs -> b -> DataFrame t as -> b) -> b -> DataFrame t asbs -> b
-- | Right-associative fold of a DataFrame The fold is strict, so
-- accumulater is evaluated to WHNF; but you'd better make sure that the
-- function is strict enough to not produce memory leaks deeply inside
-- the result data type.
ewfoldr :: SubSpace t as bs asbs => (DataFrame t as -> b -> b) -> b -> DataFrame t asbs -> b
-- | Right-associative fold of a DataFrame with an index The fold is
-- strict, so accumulater is evaluated to WHNF; but you'd better make
-- sure that the function is strict enough to not produce memory leaks
-- deeply inside the result data type.
iwfoldr :: SubSpace t as bs asbs => (Idx bs -> DataFrame t as -> b -> b) -> b -> DataFrame t asbs -> b
-- | Apply an applicative functor on each element (Lens-like traversal)
elementWise :: forall s (as' :: [Nat]) (asbs' :: [Nat]) f. (SubSpace t as bs asbs, Applicative f, SubSpace s as' bs asbs') => (DataFrame s as' -> f (DataFrame t as)) -> DataFrame s asbs' -> f (DataFrame t asbs)
-- | Apply an applicative functor on each element with its index (Lens-like
-- indexed traversal)
indexWise :: forall s (as' :: [Nat]) (asbs' :: [Nat]) f. (SubSpace t as bs asbs, Applicative f, SubSpace s as' bs asbs') => (Idx bs -> DataFrame s as' -> f (DataFrame t as)) -> DataFrame s asbs' -> f (DataFrame t asbs)
-- | Index an element (reverse of !.)
(!) :: SubSpace t (as :: [Nat]) (bs :: [Nat]) (asbs :: [Nat]) => DataFrame t asbs -> Idx bs -> DataFrame t as
infixl 4 !
-- | Apply a functor over a single element (simple lens)
element :: forall t (as :: [Nat]) (bs :: [Nat]) (asbs :: [Nat]) f. (SubSpace t as bs asbs, Applicative f) => Idx bs -> (DataFrame t as -> f (DataFrame t as)) -> DataFrame t asbs -> f (DataFrame t asbs)
ewfoldMap :: forall t (as :: [Nat]) (bs :: [Nat]) (asbs :: [Nat]) m. (Monoid m, SubSpace t as bs asbs) => (DataFrame t as -> m) -> DataFrame t asbs -> m
iwfoldMap :: forall t (as :: [Nat]) (bs :: [Nat]) (asbs :: [Nat]) m. (Monoid m, SubSpace t as bs asbs) => (Idx bs -> DataFrame t as -> m) -> DataFrame t asbs -> m
-- | Zip two spaces on a specified subspace element-wise (without index)
ewzip :: forall t (as :: [Nat]) (bs :: [Nat]) (asbs :: [Nat]) s (as' :: [Nat]) (asbs' :: [Nat]) r (as'' :: [Nat]) (asbs'' :: [Nat]). (SubSpace t as bs asbs, SubSpace s as' bs asbs', SubSpace r as'' bs asbs'') => (DataFrame t as -> DataFrame s as' -> DataFrame r as'') -> DataFrame t asbs -> DataFrame s asbs' -> DataFrame r asbs''
-- | Zip two spaces on a specified subspace index-wise (with index)
iwzip :: forall t (as :: [Nat]) (bs :: [Nat]) (asbs :: [Nat]) s (as' :: [Nat]) (asbs' :: [Nat]) r (as'' :: [Nat]) (asbs'' :: [Nat]). (SubSpace t as bs asbs, SubSpace s as' bs asbs', SubSpace r as'' bs asbs'') => (Idx bs -> DataFrame t as -> DataFrame s as' -> DataFrame r as'') -> DataFrame t asbs -> DataFrame s asbs' -> DataFrame r asbs''
class ConcatList as bs asbs => Contraction (t :: Type) (as :: [Nat]) (bs :: [Nat]) (asbs :: [Nat]) | asbs as -> bs, asbs bs -> as, as bs -> asbs
-- | Generalization of a matrix product: take scalar product over one
-- dimension and, thus, concatenate other dimesnions
contract :: (Contraction t as bs asbs, KnownDim m, PrimBytes (DataFrame t (as +: m)), PrimBytes (DataFrame t (m :+ bs)), PrimBytes (DataFrame t asbs)) => DataFrame t (as +: m) -> DataFrame t (m :+ bs) -> DataFrame t asbs
-- | Tensor contraction. In particular: 1. matrix-matrix product 2.
-- matrix-vector or vector-matrix product 3. dot product of two vectors.
(%*) :: (ConcatList as bs (as ++ bs), Contraction t as bs asbs, KnownDim m, PrimBytes (DataFrame t (as +: m)), PrimBytes (DataFrame t (m :+ bs)), PrimBytes (DataFrame t (as ++ bs))) => DataFrame t (as +: m) -> DataFrame t (m :+ bs) -> DataFrame t (as ++ bs)
infixl 7 %*
-- | Evidence for PrimBytes class
type PrimBytesEvidence t (ds :: [Nat]) = Evidence (PrimBytes (DataFrame t ds))
inferPrimBytes :: forall t (ds :: [Nat]). (ArrayInstanceInference t ds, Dimensions ds) => PrimBytesEvidence t ds
-- | Evidence for ElementWise class
type ElementWiseEvidence t (ds :: [Nat]) = Evidence (ElementWise (Idx ds) t (DataFrame t ds))
inferElementWise :: forall t (ds :: [Nat]). (ArrayInstanceInference t ds, Dimensions ds) => ElementWiseEvidence t ds
-- | Allow all common operations on available data frames
type NumericFrameEvidence t (ds :: [Nat]) = Evidence (NumericFrame t ds)
inferNumericFrame :: forall t (ds :: [Nat]). (ArrayInstanceInference t ds, Dimensions ds) => NumericFrameEvidence t ds
-- | Append one DataFrame to another, adding up their last dimensionality
(<:>) :: forall (n :: Nat) (m :: Nat) (npm :: Nat) (ds :: [Nat]) (t :: Type). (PrimBytes (DataFrame t (ds +: n)), PrimBytes (DataFrame t (ds +: m)), PrimBytes (DataFrame t (ds +: npm)), npm ~ (n + m), n ~ (npm - m), m ~ (npm - n)) => DataFrame t (ds +: n) -> DataFrame t (ds +: m) -> DataFrame t (ds +: npm)
infixl 5 <:>
-- | Append one DataFrame to another, adding up their last dimensionality
(<::>) :: forall (ds :: [Nat]) (t :: Type). (PrimBytes (DataFrame t ds), PrimBytes (DataFrame t ds), PrimBytes (DataFrame t (ds +: 2 :: [Nat]))) => DataFrame t ds -> DataFrame t ds -> DataFrame t (ds +: 2 :: [Nat])
infixl 5 <::>
-- | Append one DataFrame to another, adding up their last dimensionality
(<+:>) :: forall (ds :: [Nat]) (n :: Nat) (m :: Nat) (t :: Type). (PrimBytes (DataFrame t (ds +: n)), PrimBytes (DataFrame t ds), PrimBytes (DataFrame t (ds +: m)), m ~ (n + 1)) => DataFrame t (ds +: n) -> DataFrame t ds -> DataFrame t (ds +: m)
infixl 5 <+:>
-- | Input must be parametrized by [Nat] to make sure every element in the
-- input list has the same dimensionality. Output is in [XNat], because
-- the last dimension is unknown at compile time
fromList :: forall ns t xns xnsm. (ns ~ AsDims xns, xnsm ~ (xns +: XN 2), PrimBytes (DataFrame t ns), Dimensions ns, ArrayInstanceInference t ns) => [DataFrame t ns] -> DataFrame t (xns +: XN 2)
-- | Implement function toList. We need to create a dedicated type
-- class for this to make it polymorphic over kind k (Nat - XNat).
class DataFrameToList t z (ds :: [k])
-- | Unwrap the last dimension of a DataFrame into a list of smaller frames
toList :: DataFrameToList t z ds => DataFrame t (ds +: z) -> [DataFrame t ds]
-- | Broadcast scalar value onto a whole data frame
fromScalar :: ElementWise (Idx ds) t (DataFrame t ds) => Scalar t -> DataFrame t ds
-- | Access elements. i is an index type x is an element t is a container
-- type
class ElementWise i x t | t -> x i
-- | A singleton type used to prove that the given Array family instance
-- has a known instance
type ArrayInstanceEvidence t (ds :: [Nat]) = Evidence (ArrayInstanceInference t ds)
-- | Keep information about the instance behind Array family
data ArrayInstance t (ds :: [Nat])
AIScalar :: ArrayInstance t
AIArrayF :: ArrayInstance t
AIArrayD :: ArrayInstance t
AIArrayI :: ArrayInstance t
AIArrayI8 :: ArrayInstance t
AIArrayI16 :: ArrayInstance t
AIArrayI32 :: ArrayInstance t
AIArrayI64 :: ArrayInstance t
AIArrayW :: ArrayInstance t
AIArrayW8 :: ArrayInstance t
AIArrayW16 :: ArrayInstance t
AIArrayW32 :: ArrayInstance t
AIArrayW64 :: ArrayInstance t
AIFloatX2 :: ArrayInstance t
AIFloatX3 :: ArrayInstance t
AIFloatX4 :: ArrayInstance t
getArrayInstance :: forall t (ds :: [Nat]). ArrayInstanceInference t ds => ArrayInstance t ds
-- | Given element type instance and proper dimension list, infer a
-- corresponding array instance
inferArrayInstance :: forall t ds. (FiniteList ds, KnownDims ds, ElemTypeInference t) => ArrayInstanceEvidence t ds
class ArraySizeInference ds
-- | Pattern match agains result to get actual array dimensionality
arraySizeInstance :: ArraySizeInference ds => ArraySize ds
inferSnocArrayInstance :: (ArraySizeInference ds, ElemTypeInference t, KnownDim z) => p t ds -> q z -> ArrayInstanceEvidence t (ds +: z)
inferConsArrayInstance :: (ArraySizeInference ds, ElemTypeInference t, KnownDim z) => q z -> p t ds -> ArrayInstanceEvidence t (z :+ ds)
inferInitArrayInstance :: (ArraySizeInference ds, ElemTypeInference t) => p t ds -> ArrayInstanceEvidence t (Init ds)
-- | Keep information about the array dimensionality
data ArraySize (ds :: [Nat])
ASScalar :: ArraySize
ASX2 :: ArraySize
ASX3 :: ArraySize
ASX4 :: ArraySize
ASXN :: ArraySize
ASArray :: ArraySize
class ElemTypeInference t
-- | Pattern match against result to get specific element type
elemTypeInstance :: ElemTypeInference t => ElemType t
-- | Keep information about the element type instance
data ElemType t
ETFloat :: ElemType t
ETDouble :: ElemType t
ETInt :: ElemType t
ETInt8 :: ElemType t
ETInt16 :: ElemType t
ETInt32 :: ElemType t
ETInt64 :: ElemType t
ETWord :: ElemType t
ETWord8 :: ElemType t
ETWord16 :: ElemType t
ETWord32 :: ElemType t
ETWord64 :: ElemType t