module Numeric.GSL.IO (
saveMatrix,
fwriteVector, freadVector, fprintfVector, fscanfVector,
fileDimensions, loadMatrix, fromFile
) where
import Numeric.LinearAlgebra.HMatrix hiding(saveMatrix, loadMatrix)
import Numeric.GSL.Vector
import System.Process(readProcess)
fileDimensions :: FilePath -> IO (Int,Int)
fileDimensions :: FilePath -> IO (Int, Int)
fileDimensions FilePath
fname = do
FilePath
wcres <- FilePath -> [FilePath] -> FilePath -> IO FilePath
readProcess FilePath
"wc" [FilePath
"-w",FilePath
fname] FilePath
""
FilePath
contents <- FilePath -> IO FilePath
readFile FilePath
fname
let tot :: Int
tot = FilePath -> Int
forall a. Read a => FilePath -> a
read (FilePath -> Int) -> (FilePath -> FilePath) -> FilePath -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [FilePath] -> FilePath
forall a. HasCallStack => [a] -> a
head ([FilePath] -> FilePath)
-> (FilePath -> [FilePath]) -> FilePath -> FilePath
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FilePath -> [FilePath]
words (FilePath -> Int) -> FilePath -> Int
forall a b. (a -> b) -> a -> b
$ FilePath
wcres
c :: Int
c = [FilePath] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([FilePath] -> Int) -> (FilePath -> [FilePath]) -> FilePath -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[FilePath]] -> [FilePath]
forall a. HasCallStack => [a] -> a
head ([[FilePath]] -> [FilePath])
-> (FilePath -> [[FilePath]]) -> FilePath -> [FilePath]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([FilePath] -> Bool) -> [[FilePath]] -> [[FilePath]]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile [FilePath] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([[FilePath]] -> [[FilePath]])
-> (FilePath -> [[FilePath]]) -> FilePath -> [[FilePath]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (FilePath -> [FilePath]) -> [FilePath] -> [[FilePath]]
forall a b. (a -> b) -> [a] -> [b]
map FilePath -> [FilePath]
words ([FilePath] -> [[FilePath]])
-> (FilePath -> [FilePath]) -> FilePath -> [[FilePath]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FilePath -> [FilePath]
lines (FilePath -> Int) -> FilePath -> Int
forall a b. (a -> b) -> a -> b
$ FilePath
contents
if Int
tot Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0
then (Int, Int) -> IO (Int, Int)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Int
tot Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
c, Int
c)
else (Int, Int) -> IO (Int, Int)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Int
0,Int
0)
loadMatrix :: FilePath -> IO (Matrix Double)
loadMatrix :: FilePath -> IO (Matrix Double)
loadMatrix FilePath
file = FilePath -> (Int, Int) -> IO (Matrix Double)
fromFile FilePath
file ((Int, Int) -> IO (Matrix Double))
-> IO (Int, Int) -> IO (Matrix Double)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< FilePath -> IO (Int, Int)
fileDimensions FilePath
file
fromFile :: FilePath -> (Int,Int) -> IO (Matrix Double)
fromFile :: FilePath -> (Int, Int) -> IO (Matrix Double)
fromFile FilePath
filename (Int
r,Int
c) = Int -> Vector Double -> Matrix Double
forall t. Storable t => Int -> Vector t -> Matrix t
reshape Int
c (Vector Double -> Matrix Double)
-> IO (Vector Double) -> IO (Matrix Double)
forall a b. (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` FilePath -> Int -> IO (Vector Double)
fscanfVector FilePath
filename (Int
rInt -> Int -> Int
forall a. Num a => a -> a -> a
*Int
c)