module Data.IDX (
IDXData
, IDXLabels
, IDXContentType(..)
, idxType
, idxDimensions
, isIDXReal
, isIDXIntegral
, idxDoubleContent
, idxIntContent
, labeledIntData
, labeledDoubleData
, encodeIDXLabels
, decodeIDXLabels
, encodeIDXLabelsFile
, decodeIDXLabelsFile
, encodeIDX
, decodeIDX
, encodeIDXFile
, decodeIDXFile
)where
import Control.Applicative ((<$>))
import Control.Monad
import Data.Binary
import Data.ByteString.Lazy (ByteString)
import qualified Data.ByteString.Lazy as BL
import Data.IDX.Internal
import Data.Int
import Data.Traversable
import qualified Data.Vector.Unboxed as V
import Data.Vector.Unboxed ((!))
import Data.Word
labeledIntData:: IDXLabels -> IDXData -> Maybe [(Int, V.Vector Int)]
labeledIntData (IDXLabels v) dat =
if (V.length v) == dim0
then Just $ do
i <- [0 .. dim0 1]
let lab = v ! i
return $ (lab,V.slice (i*entrySize) entrySize content)
else Nothing
where
dim0 = (idxDimensions dat) ! 0
content = idxIntContent dat
entrySize = (V.product $ idxDimensions dat) `div` dim0
labeledDoubleData:: IDXLabels -> IDXData -> Maybe [(Int, V.Vector Double)]
labeledDoubleData (IDXLabels v) dat =
if (V.length v) == dim0
then Just $ do
i <- [0 .. dim0 1]
let lab = v ! i
return $ (lab,V.slice (i*entrySize) entrySize content)
else Nothing
where
dim0 = (idxDimensions dat) ! 0
content = idxDoubleContent dat
entrySize = (V.product $ idxDimensions dat) `div` dim0
decodeIDXLabelsFile :: FilePath -> IO (Maybe IDXLabels)
decodeIDXLabelsFile path = BL.readFile path >>= return . decodeIDXLabels
decodeIDXLabels :: BL.ByteString -> Maybe IDXLabels
decodeIDXLabels content = case decodeOrFail content of
Right (_,_,result) -> Just result
Left _ -> Nothing
encodeIDXLabelsFile :: IDXLabels -> FilePath -> IO ()
encodeIDXLabelsFile labs path = encodeFile path labs
encodeIDXLabels :: IDXLabels -> BL.ByteString
encodeIDXLabels = encode
decodeIDXFile :: FilePath -> IO (Maybe IDXData)
decodeIDXFile path = BL.readFile path >>= return . decodeIDX
decodeIDX :: BL.ByteString -> Maybe IDXData
decodeIDX content = case decodeOrFail content of
Right (_,_,result) -> Just result
Left _ -> Nothing
encodeIDXFile :: IDXData -> FilePath -> IO ()
encodeIDXFile idx path = encodeFile path idx
encodeIDX :: IDXData -> BL.ByteString
encodeIDX = encode