module Data.Tensor (
Tensor(..),
tshape, tdata, nnz, rank, dim,
Sh(..),
Dim.Dd(..), Dim.Sd(..)) where
import qualified Data.Vector as V
import Control.Applicative
import qualified Data.Shape as Shape (dim, rank)
import Data.Shape (Sh(..),
Z,
D1, D2, CSR, COO, mkD2, mkCSR, mkCOO)
import qualified Data.Dim as Dim
data Tensor i a where
Tensor :: Sh i -> V.Vector a -> Tensor (Sh i) a
mkT :: Sh i -> V.Vector a -> Tensor (Sh i) a
mkT = Tensor
instance Functor (Tensor i) where
fmap f (Tensor sh v) = Tensor sh (f <$> v)
pure' :: a -> Tensor (Sh Z) a
pure' = mkT Z . V.singleton
instance (Eq a) => Eq (Tensor i a) where
(Tensor sh1 d1) == (Tensor sh2 d2) = sh1 == sh2 && d1 == d2
instance (Show a) => Show (Tensor i a) where
show (Tensor sh d) = unwords [show sh, show $ V.take 5 d, "..."]
tshape :: Tensor sh a -> sh
tshape (Tensor sh _) = sh
tdata :: Tensor sh a -> V.Vector a
tdata (Tensor _ td) = td
nnz :: Tensor i a -> Int
nnz (Tensor _ td) = V.length td
rank :: Tensor i a -> Int
rank (Tensor sh _) = Shape.rank sh
dim :: Tensor i a -> [Int]
dim (Tensor sh _) = Shape.dim sh