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 (Shape(..), dim, rank)
import Data.Shape (Sh(..),
Z,
D1, D2, CSR, COO, mkD2, mkCSR, mkCOO)
import qualified Data.Shape.Dynamic as ShDyn
import qualified Data.Dim as Dim
data Tenzor i a = Tenzor {tzShape :: ShDyn.ShD i, tzData :: V.Vector a }
instance Integral i => Shape.Shape (Tenzor i a) where
type ShapeT (Tenzor i a) = ShDyn.ShD i
shape = tzShape
shRank = ShDyn.rank . Shape.shape
shDim = ShDyn.dim . Shape.shape
instance Shape.Shape (Tensor (Sh i) a) where
type ShapeT (Tensor (Sh i) a) = Sh i
shape = tshape
shRank = rank
shDim = 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