multilinear-io 0.3.0.0 → 0.4.0.0
raw patch · 6 files changed
+86/−47 lines, 6 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Multilinear.Generic.Serialize: instance (Data.Aeson.Types.FromJSON.FromJSON a, Data.Vector.Unboxed.Base.Unbox a) => Data.Aeson.Types.FromJSON.FromJSON (Multilinear.Generic.Tensor a)
- Multilinear.Generic.Serialize: instance (Data.Aeson.Types.ToJSON.ToJSON a, Data.Vector.Unboxed.Base.Unbox a) => Data.Aeson.Types.ToJSON.ToJSON (Multilinear.Generic.Tensor a)
- Multilinear.Generic.Serialize: instance (Data.Csv.Conversion.FromField a, Data.Vector.Unboxed.Base.Unbox a) => Data.Csv.Conversion.FromRecord (Multilinear.Generic.Tensor a)
- Multilinear.Generic.Serialize: instance (Data.Csv.Conversion.ToField a, Data.Vector.Unboxed.Base.Unbox a) => Data.Csv.Conversion.ToRecord (Multilinear.Generic.Tensor a)
- Multilinear.Generic.Serialize: instance (Data.Serialize.Serialize a, Data.Vector.Unboxed.Base.Unbox a) => Data.Serialize.Serialize (Multilinear.Generic.Tensor a)
- Multilinear.Index.Infinite.Serialize: Contravariant :: String -> Index
- Multilinear.Index.Infinite.Serialize: Covariant :: String -> Index
- Multilinear.Index.Infinite.Serialize: Indifferent :: String -> Index
- Multilinear.Index.Infinite.Serialize: [indexName'] :: Index -> String
- Multilinear.Index.Infinite.Serialize: data Index
- Multilinear.Index.Infinite.Serialize: instance Data.Aeson.Types.FromJSON.FromJSON Multilinear.Index.Infinite.Index
- Multilinear.Index.Infinite.Serialize: instance Data.Aeson.Types.ToJSON.ToJSON Multilinear.Index.Infinite.Index
- Multilinear.Index.Infinite.Serialize: instance Data.Serialize.Serialize Multilinear.Index.Infinite.Index
+ Multilinear.Generic.Serialize: instance (Data.Aeson.Types.FromJSON.FromJSON a, Data.Vector.Unboxed.Base.Unbox a) => Data.Aeson.Types.FromJSON.FromJSON (Multilinear.Generic.Sequential.Tensor a)
+ Multilinear.Generic.Serialize: instance (Data.Aeson.Types.ToJSON.ToJSON a, Data.Vector.Unboxed.Base.Unbox a) => Data.Aeson.Types.ToJSON.ToJSON (Multilinear.Generic.Sequential.Tensor a)
+ Multilinear.Generic.Serialize: instance (Data.Csv.Conversion.FromField a, Data.Vector.Unboxed.Base.Unbox a) => Data.Csv.Conversion.FromRecord (Multilinear.Generic.Sequential.Tensor a)
+ Multilinear.Generic.Serialize: instance (Data.Csv.Conversion.ToField a, Data.Vector.Unboxed.Base.Unbox a) => Data.Csv.Conversion.ToRecord (Multilinear.Generic.Sequential.Tensor a)
+ Multilinear.Generic.Serialize: instance (Data.Serialize.Serialize a, Data.Vector.Unboxed.Base.Unbox a) => Data.Serialize.Serialize (Multilinear.Generic.Sequential.Tensor a)
Files
- ChangeLog.md +4/−0
- README.md +1/−6
- multilinear-io.cabal +4/−5
- src/Multilinear/Generic/Serialize.hs +0/−1
- src/Multilinear/Index/Infinite/Serialize.hs +0/−27
- test/csv/Spec.hs +77/−8
ChangeLog.md view
@@ -1,3 +1,7 @@+# 0.4.0.0, 2018-11-24 +- ported to multilinear-0.4.0.0 +- added more robust tests + # 0.3.0.0, 2018-11-14 - ported to multilinear-0.3.0.0
README.md view
@@ -1,9 +1,4 @@-# README - -## Build status -- Travis (Linux, macOS): [](https://travis-ci.org/ArturB/multilinear-io) -- AppVeyor (Windows): [](https://ci.appveyor.com/api/projects/status/github/ArturB/multilinear-io) +# multilinear-io [](https://hackage.haskell.org/package/multilinear-io) [](https://travis-ci.org/ArturB/multilinear-io) ## Summary This package provides conduit-based input/output capability for [Multilinear](https://github.com/ArturB/multilinear) package, in various formats:
multilinear-io.cabal view
@@ -2,12 +2,12 @@ -- -- see: https://github.com/sol/hpack ----- hash: 86b14a55f0044713d22b5d0d065b6241e7d37686463ad116dde83c012791e38b+-- hash: e8f399289e551ae39e7efffa83e1b8f92a5cb52d1d5f332879287e1a14387be1 name: multilinear-io-version: 0.3.0.0-synopsis: Input/output capability for multilinear package.-description: Input & output capability for multilinear package <https://hackage.haskell.org/package/multilinear>. Supports various file formats: binary, CSV, JSON. More information available on GitHub: <https://github.com/ArturB/multilinear-io#readme>+version: 0.4.0.0+synopsis: Conduit-vased input/output capability for multilinear package.+description: Conduit-based input & output capability for multilinear package <https://hackage.haskell.org/package/multilinear>. Supports various file formats: binary, CSV, JSON. More information available on GitHub: <https://github.com/ArturB/multilinear-io#readme> category: Machine learning homepage: https://github.com/ArturB/multilinear-io#readme bug-reports: https://github.com/ArturB/multilinear-io/issues@@ -30,7 +30,6 @@ exposed-modules: Multilinear.Generic.Serialize Multilinear.Index.Finite.Serialize- Multilinear.Index.Infinite.Serialize other-modules: Paths_multilinear_io hs-source-dirs:
src/Multilinear/Generic/Serialize.hs view
@@ -37,7 +37,6 @@ import Multilinear.Generic import qualified Multilinear.Index.Finite as Finite import Multilinear.Index.Finite.Serialize () -import Multilinear.Index.Infinite.Serialize () -- Binary serialization instance instance (Serialize a, Unboxed.Unbox a) => Serialize (Tensor a)
− src/Multilinear/Index/Infinite/Serialize.hs
@@ -1,27 +0,0 @@-{-| -Module : Multilinear.Index.Infinite.Serialize -Description : Infinite-dimensional tensor index serialization: binary, JSON. -Copyright : (c) Artur M. Brodzki, 2018 -License : BSD3 -Maintainer : artur@brodzki.org -Stability : experimental -Portability : Windows/POSIX - -Infinite-dimensional tensor index. - --} - -module Multilinear.Index.Infinite.Serialize ( - Index(..) -) where - -import Data.Aeson -import Data.Serialize -import Multilinear.Index.Infinite - -{-| Binary serialization and deserialization |-} -instance Serialize Index - -{-| Serialization to and from JSON |-} -instance FromJSON Index -instance ToJSON Index
test/csv/Spec.hs view
@@ -10,17 +10,71 @@ import Multilinear.Generic.Serialize import Multilinear.Index import qualified Multilinear.Matrix as Matrix +import qualified Multilinear.Vector as Vector import System.Directory -fileName1 :: String -fileName1 = "test/m1" +matrix :: Tensor Double +matrix = Matrix.fromIndices "ij" 50 50 $ \i j -> cos (fromIntegral i) + sin (fromIntegral j) -m1 :: Tensor Double -m1 = Matrix.fromIndices "ij" 50 50 $ \i j -> cos (fromIntegral i) + sin (fromIntegral j) +vector :: Tensor Double +vector = Vector.fromIndices "i" 50 $ \i -> cos (fromIntegral i) +form :: Tensor Double +form = Vector.fromIndices "i" 50 $ \i -> cos (fromIntegral i) + +scalar :: Tensor Double +scalar = Scalar 5.0 + +writeScalarCSV :: Tensor Double -> String -> IO () +writeScalarCSV m fileName = do + putStrLn $ "Writing scalar to " ++ fileName ++ ".csv..." + m `toCSVFile` (fileName ++ ".csv") + putStrLn "Scalar successfully written!" + +readScalarCSV :: Tensor Double -> String -> ExceptT String IO () +readScalarCSV m fileName = do + lift $ putStrLn $ "Reading scalar s1 from " ++ fileName ++ ".csv..." + (m1' :: Tensor Double) <- fromCSVFile (fileName ++ ".csv") ',' "ij" + if m1' == m then + lift $ putStrLn "Scalar successfully read!" + else + ExceptT $ return $ Left "Scalar deserialization error" + +writeVectorCSV :: Tensor Double -> String -> IO () +writeVectorCSV m fileName = do + let size = fromJust . indexSize <$> head $ indices m + putStrLn $ "Writing " ++ show size ++ " elements vector to " ++ fileName ++ ".csv..." + m `toCSVFile` (fileName ++ ".csv") + putStrLn "Vector successfully written!" + +readVectorCSV :: Tensor Double -> String -> ExceptT String IO () +readVectorCSV m fileName = do + lift $ putStrLn $ "Reading vector v1 from " ++ fileName ++ ".csv..." + (m1' :: Tensor Double) <- fromCSVFile (fileName ++ ".csv") ',' "ij" + if m1' == m then + lift $ putStrLn "Vector successfully read!" + else + ExceptT $ return $ Left "Vector deserialization error" + +writeFormCSV :: Tensor Double -> String -> IO () +writeFormCSV m fileName = do + let size = fromJust . indexSize <$> head $ indices m + putStrLn $ "Writing " ++ show size ++ " elements form to " ++ fileName ++ ".csv..." + m `toCSVFile` (fileName ++ ".csv") + putStrLn "Form successfully written!" + +readFormCSV :: Tensor Double -> String -> ExceptT String IO () +readFormCSV m fileName = do + lift $ putStrLn $ "Reading form f1 from " ++ fileName ++ ".csv..." + (m1' :: Tensor Double) <- fromCSVFile (fileName ++ ".csv") ',' "ij" + if m1' == m then + lift $ putStrLn "Form successfully read!" + else + ExceptT $ return $ Left "Form deserialization error" + writeMatrixCSV :: Tensor Double -> String -> IO () writeMatrixCSV m fileName = do - let [xsize,ysize] = indexSize <$> indices m1 + let [xsize,ysize] = indexSize <$> indices m putStrLn $ "Writing " ++ show (fromJust xsize) ++ "x" ++ show (fromJust ysize) ++ " matrix to " ++ fileName ++ ".csv..." m `toCSVFile` (fileName ++ ".csv") putStrLn "Matrix successfully written!" @@ -34,10 +88,25 @@ else ExceptT $ return $ Left "Matrix deserialization error" + -- ENTRY POINT main :: IO () main = do - writeMatrixCSV m1 fileName1 - runExceptT $ readMatrixCSV m1 fileName1 - removeFile $ fileName1 ++ ".csv" + -- Scalar CSV read/write + writeScalarCSV scalar "test/s1" + runExceptT $ readScalarCSV scalar "test/s1" + -- Vector CSV read/write + writeVectorCSV vector "test/v1" + runExceptT $ readVectorCSV vector "test/v1" + -- Form CSV read/write + writeFormCSV form "test/f1" + runExceptT $ readFormCSV form "test/f1" + -- Matrix CSV read/write + writeMatrixCSV matrix "test/m1" + runExceptT $ readMatrixCSV matrix "test/m1" + -- Remove test file + removeFile "test/s1.csv" + removeFile "test/v1.csv" + removeFile "test/f1.csv" + removeFile "test/m1.csv" return ()