HNumeric 0.3.3.0 → 0.4.0.0
raw patch · 6 files changed
+130/−10 lines, 6 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ HNum.CSV: (#) :: Eq a => DataFrame a -> String -> Vector a
+ HNum.CSV: instance HNum.Vector.Convertable HNum.CSV.DataFrame
+ HNum.F: class Functor f => FuncTools f
+ HNum.F: hdrop :: FuncTools f => Int -> f a -> f a
+ HNum.F: hdropWhile :: FuncTools f => (a -> Bool) -> f a -> f a
+ HNum.F: hfilter :: FuncTools f => (a -> Bool) -> f a -> f a
+ HNum.F: hflat :: FuncTools f => ([a] -> a) -> f a -> a
+ HNum.F: hlift :: FuncTools f => ([a] -> [b]) -> f a -> f b
+ HNum.F: hmap :: FuncTools f => (a -> b) -> f a -> f b
+ HNum.F: htake :: FuncTools f => Int -> f a -> f a
+ HNum.F: htakeWhile :: FuncTools f => (a -> Bool) -> f a -> f a
+ HNum.F: instance HNum.F.FuncTools HNum.Vector.Matrix
+ HNum.F: instance HNum.F.FuncTools HNum.Vector.Vector
+ HNum.Vector: (!) :: List m => m a -> Int -> a
+ HNum.Vector: class Functor f => Convertable f
+ HNum.Vector: fd :: Eq a => a -> [a] -> Int
+ HNum.Vector: findFirst :: (List m, Eq a) => a -> m a -> Int
+ HNum.Vector: instance HNum.Vector.Convertable HNum.Vector.Matrix
+ HNum.Vector: instance HNum.Vector.Convertable HNum.Vector.Vector
+ HNum.Vector: readDouble :: Convertable f => f String -> f Double
+ HNum.Vector: readInt :: Convertable f => f String -> f Int
+ HNum.Vector: readInteger :: Convertable f => f String -> f Integer
Files
- ChangeLog.md +5/−1
- HNumeric.cabal +3/−2
- README.md +16/−5
- src/HNum/CSV.hs +17/−1
- src/HNum/F.hs +44/−0
- src/HNum/Vector.hs +45/−1
ChangeLog.md view
@@ -1,3 +1,7 @@ # Changelog for HNumeric -## Unreleased changes+## 0.4.0.0++* Add HNum.F (Functional Programming Library for HNum)+* Add Convertable Class (HNumObj String -> HNumObj (Int or Integer or Double))+* Add (!) for Vector (v ! 1 == (toList v) !! 1)
HNumeric.cabal view
@@ -2,10 +2,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: 35b947c6b91e1d075b0700a52de393b87f6749f5649ab43e268623c898e675e3+-- hash: a31a8bb1239bf98ba7561f43ae6c7fe1005cd190658fb003dd7a222ffd8ae071 name: HNumeric-version: 0.3.3.0+version: 0.4.0.0 synopsis: Haskell Numeric Library with pure functionality, R & MATLAB Syntax. description: Please see the README on GitHub at <https://github.com/Axect/HNumeric#readme> category: HNum, library, Numeric, LinearAlgebra, Statistics, bsd3@@ -29,6 +29,7 @@ library exposed-modules: HNum.CSV+ HNum.F HNum.Stats HNum.Vector other-modules:
README.md view
@@ -5,7 +5,9 @@ ## Packages * HNum.Vector : Contain vector, matrix, linear algebra-* HNum.Stats : Contain statistical functions+* HNum.Stats : Contain statistical functions+* HNum.CSV : CSV Tools for HNum (Contain DataFrame)+* HNum.F : Functional Programming Tools for HNum ## Installation @@ -48,12 +50,20 @@ Then enjoy! +## Documentation++Documentation is prepared on authorea++[HNumeric Documentation](https://www.authorea.com/users/223838/articles/307659-hnumeric-documentation)+ ## Usage ### Import Module * HNum.Vector * HNum.Stats+* HNum.CSV+* HNum.F ### Basic Vector Usage @@ -162,9 +172,10 @@ * Effective Matrix Structure (R-like Structure) * Divide and Conquer Matrix Multiplication, Determinant, Inverse+* Module CSV with DataFrame (read / write)+* FuncTools -### TODO (2018.06.08)+### TODO (2018.06.13) -* DSL Documentation by LaTeX (Soon)-* Make CSV Package-* Make DataFrame type+* DSL Documentation by LaTeX (Developing)+* More Statistical Tools
src/HNum/CSV.hs view
@@ -17,7 +17,9 @@ type Header = [String] -- | DataFrame structure to write csv-data DataFrame a = DataFrame { header :: Header, dat :: Matrix a} deriving (Show, Eq)+data DataFrame a = DataFrame { header :: Header+ , dat :: Matrix a+ } deriving (Show, Eq) -- | dataframe constructor dataframe :: Header -> Matrix a -> DataFrame a@@ -29,9 +31,22 @@ fromVectors :: Header -> [Vector a] -> DataFrame a fromVectors h vs = dataframe h (matrix vs') where vs' = map toList vs +-- | Extract Vector in DataFrame+(#) :: Eq a => DataFrame a -> String -> Vector a+df # hd | hd `notElem` header df = error "No specific header in dataFrame"+ | otherwise = vec $ bd !! i+ where+ i = hd `fd` header df+ bd = matForm $ transpose $ dat df+ instance Functor DataFrame where fmap f df = df { dat = fmap f (dat df) } +instance Convertable DataFrame where+ readInt df = read <$> df :: DataFrame Int+ readInteger df = read <$> df :: DataFrame Integer+ readDouble df = read <$> df :: DataFrame Double+ ----------------------------------------------- -- Write to CSV -----------------------------------------------@@ -97,3 +112,4 @@ clean = takeWhile (/= '"') x temp = dropWhile (/= '"') x clean' = tail temp+
+ src/HNum/F.hs view
@@ -0,0 +1,44 @@+module HNum.F where++import HNum.Vector+import HNum.CSV++-- | Functional Programming Tools for HNum Object+class Functor f => FuncTools f where+ -- | Absolute Abstraction with Scalar Function+ hflat :: ([a] -> a) -> f a -> a+ -- | Absolute Abstraction with Vector Function+ hlift :: ([a] -> [b]) -> f a -> f b+ -- | Like map+ hmap :: (a -> b) -> f a -> f b+ -- | Like filter+ hfilter :: (a -> Bool) -> f a -> f a+ -- | Like take+ htake :: Int -> f a -> f a+ -- | Like takeWhile+ htakeWhile :: (a -> Bool) -> f a -> f a+ -- | Like drop+ hdrop :: Int -> f a -> f a+ -- | Like dropWhile+ hdropWhile :: (a -> Bool) -> f a -> f a++instance FuncTools Vector where+ hflat f = f . toList+ hlift f = vec . f . toList+ hmap = hlift . map+ hfilter = hlift . filter+ htake n = hlift (take n)+ htakeWhile f = hlift (takeWhile f)+ hdrop n = hlift (drop n)+ hdropWhile f = hlift (dropWhile f)++instance FuncTools Matrix where+ hflat = undefined+ hlift f = matrix . map f . matForm+ hmap = hlift . map+ hfilter = hlift . filter+ htake n = hlift (take n)+ htakeWhile f = hlift (takeWhile f)+ hdrop n = hlift (drop n)+ hdropWhile f = hlift (dropWhile f)+
src/HNum/Vector.hs view
@@ -71,19 +71,33 @@ -- Class for Vector with List class List m where+ -- | to List toList :: m a -> [a]+ -- | From List fromList :: [a] -> m a+ -- | Extract Element+ (!) :: m a -> Int -> a+ -- | Find Position of Element+ findFirst :: Eq a => a -> m a -> Int instance List Vector where toList (Vector xs) = xs fromList = Vector+ v ! n = toList v !! n+ findFirst n v | n `notElem` v = error "Not element!"+ | otherwise = snd $ head $ dropWhile (\x -> fst x /= n) idx+ where idx = zip (toList v) [0..] --------------------------------------------------- -- Matrix --------------------------------------------------- -- |Definition of Matrix-data Matrix a = Matrix {val :: Vector a, row :: Int, col :: Int, byRow :: Bool} deriving (Eq)+data Matrix a = Matrix { val :: Vector a+ , row :: Int+ , col :: Int+ , byRow :: Bool+ } deriving (Eq) -- |matrix is syntactic sugar to create Matrix matrix :: [[a]] -> Matrix a@@ -91,7 +105,9 @@ -- |Matrices is necessary class for Matrix class Matrices m where+ -- | Matrix to Array matForm :: m a -> [[a]]+ -- | Array to Matrix formMat :: [[a]] -> m a instance Matrices Matrix where@@ -159,6 +175,28 @@ foldl f z (Matrix (Vector xs) _ _ _) = foldl f z xs ---------------------------------------------------+-- Type Conversion+---------------------------------------------------+-- | Syntactic Sugar of read of functor+class Functor f => Convertable f where+ -- | Read String to Int+ readInt :: f String -> f Int+ -- | Read String to Integer+ readInteger :: f String -> f Integer+ -- | Read String to Double+ readDouble :: f String -> f Double++instance Convertable Vector where+ readInt v = read <$> v :: Vector Int+ readInteger v = read <$> v :: Vector Integer+ readDouble v = read <$> v :: Vector Double++instance Convertable Matrix where+ readInt m = read <$> m :: Matrix Int+ readInteger m = read <$> m :: Matrix Integer+ readDouble m = read <$> m :: Matrix Double++--------------------------------------------------- -- Operation --------------------------------------------------- {-|@@ -423,3 +461,9 @@ a12 = negMap a00 %-*-% m12 %-*-% s00 a21 = negMap s00 %-*-% m21 %-*-% a00 a22 = s00++-- | Find First +fd :: Eq a => a -> [a] -> Int+fd n v | n `notElem` v = error "Not element!"+ | otherwise = snd $ head $ dropWhile (\x -> fst x /= n) idx+ where idx = zip v [0 ..]