{-# language GADTs, TypeOperators #-} module Data.Dim where import Data.Vector.Unboxed as V -- * Dimension metadata -- | To define a /dense/ dimension we only need the dimensionality parameter newtype Dd i = Dd { dDim :: i } deriving (Eq, Show) -- | To define a /sparse/ dimension we need a cumulative array, an index array and a dimensionality parameter data Sd i = Sd { -- | Cumulative array (# nonzero entries per degree of freedom). Not all storage formats (e.g. COO for rank-2 tensors) need this information. sCml :: Maybe (V.Vector i) -- | Index array (indices of nonzero entries) , sIdx :: V.Vector i -- | Size of the tensor along this dimension , sDim :: i } deriving (Eq, Show) -- | A tensor dimension can be either dense or sparse. -- -- Example: the CSR format is /dense/ in the first index (rows) and /sparse/ in the second index (columns) -- newtype DMD i = DMD (Either (DMDDense i) (DMDSparse i)) deriving (Eq, Show)