summaryrefslogtreecommitdiff
path: root/packages/hmatrix/src/Numeric/LinearAlgebra/GSL.hs
diff options
context:
space:
mode:
authorAlberto Ruiz <aruiz@um.es>2014-05-21 09:57:03 +0200
committerAlberto Ruiz <aruiz@um.es>2014-05-21 09:57:03 +0200
commite07c3dee7235496b71a89233106d93f6cc94ada1 (patch)
tree1ad29c3fc93ee076ad68e3ee759c9a3357f9cd5b /packages/hmatrix/src/Numeric/LinearAlgebra/GSL.hs
parent92de588b82945bb251a056c34a8ef0c00cb00e5a (diff)
Numeric.Container and Numeric.LinearAlgebra moved to base
Diffstat (limited to 'packages/hmatrix/src/Numeric/LinearAlgebra/GSL.hs')
-rw-r--r--packages/hmatrix/src/Numeric/LinearAlgebra/GSL.hs136
1 files changed, 0 insertions, 136 deletions
diff --git a/packages/hmatrix/src/Numeric/LinearAlgebra/GSL.hs b/packages/hmatrix/src/Numeric/LinearAlgebra/GSL.hs
deleted file mode 100644
index 1fde621..0000000
--- a/packages/hmatrix/src/Numeric/LinearAlgebra/GSL.hs
+++ /dev/null
@@ -1,136 +0,0 @@
1-----------------------------------------------------------------------------
2-- |
3-- Module : Numeric.LinearAlgebra.GSL
4-- Copyright : (c) Alberto Ruiz 2007-14
5-- License : GPL
6-- Maintainer : Alberto Ruiz
7-- Stability : provisional
8--
9-----------------------------------------------------------------------------
10
11module Numeric.LinearAlgebra.GSL (
12 RandDist(..), randomVector,
13 saveMatrix,
14 fwriteVector, freadVector, fprintfVector, fscanfVector,
15 fileDimensions, loadMatrix, fromFile
16) where
17
18import Data.Packed
19import Numeric.GSL.Internal hiding (TV,TM,TCV,TCM)
20
21import Data.Complex
22import Foreign.Marshal.Alloc(free)
23import Foreign.Ptr(Ptr)
24import Foreign.C.Types
25import Foreign.C.String(newCString)
26import System.IO.Unsafe(unsafePerformIO)
27import System.Process(readProcess)
28
29fromei x = fromIntegral (fromEnum x) :: CInt
30
31-----------------------------------------------------------------------
32
33data RandDist = Uniform -- ^ uniform distribution in [0,1)
34 | Gaussian -- ^ normal distribution with mean zero and standard deviation one
35 deriving Enum
36
37-- | Obtains a vector of pseudorandom elements from the the mt19937 generator in GSL, with a given seed. Use randomIO to get a random seed.
38randomVector :: Int -- ^ seed
39 -> RandDist -- ^ distribution
40 -> Int -- ^ vector size
41 -> Vector Double
42randomVector seed dist n = unsafePerformIO $ do
43 r <- createVector n
44 app1 (c_random_vector (fi seed) ((fi.fromEnum) dist)) vec r "randomVector"
45 return r
46
47foreign import ccall unsafe "random_vector" c_random_vector :: CInt -> CInt -> TV
48
49--------------------------------------------------------------------------------
50
51-- | Saves a matrix as 2D ASCII table.
52saveMatrix :: FilePath
53 -> String -- ^ format (%f, %g, %e)
54 -> Matrix Double
55 -> IO ()
56saveMatrix filename fmt m = do
57 charname <- newCString filename
58 charfmt <- newCString fmt
59 let o = if orderOf m == RowMajor then 1 else 0
60 app1 (matrix_fprintf charname charfmt o) mat m "matrix_fprintf"
61 free charname
62 free charfmt
63
64foreign import ccall unsafe "matrix_fprintf" matrix_fprintf :: Ptr CChar -> Ptr CChar -> CInt -> TM
65
66--------------------------------------------------------------------------------
67
68-- | Loads a vector from an ASCII file (the number of elements must be known in advance).
69fscanfVector :: FilePath -> Int -> IO (Vector Double)
70fscanfVector filename n = do
71 charname <- newCString filename
72 res <- createVector n
73 app1 (gsl_vector_fscanf charname) vec res "gsl_vector_fscanf"
74 free charname
75 return res
76
77foreign import ccall unsafe "vector_fscanf" gsl_vector_fscanf:: Ptr CChar -> TV
78
79-- | Saves the elements of a vector, with a given format (%f, %e, %g), to an ASCII file.
80fprintfVector :: FilePath -> String -> Vector Double -> IO ()
81fprintfVector filename fmt v = do
82 charname <- newCString filename
83 charfmt <- newCString fmt
84 app1 (gsl_vector_fprintf charname charfmt) vec v "gsl_vector_fprintf"
85 free charname
86 free charfmt
87
88foreign import ccall unsafe "vector_fprintf" gsl_vector_fprintf :: Ptr CChar -> Ptr CChar -> TV
89
90-- | Loads a vector from a binary file (the number of elements must be known in advance).
91freadVector :: FilePath -> Int -> IO (Vector Double)
92freadVector filename n = do
93 charname <- newCString filename
94 res <- createVector n
95 app1 (gsl_vector_fread charname) vec res "gsl_vector_fread"
96 free charname
97 return res
98
99foreign import ccall unsafe "vector_fread" gsl_vector_fread:: Ptr CChar -> TV
100
101-- | Saves the elements of a vector to a binary file.
102fwriteVector :: FilePath -> Vector Double -> IO ()
103fwriteVector filename v = do
104 charname <- newCString filename
105 app1 (gsl_vector_fwrite charname) vec v "gsl_vector_fwrite"
106 free charname
107
108foreign import ccall unsafe "vector_fwrite" gsl_vector_fwrite :: Ptr CChar -> TV
109
110type PD = Ptr Double --
111type TV = CInt -> PD -> IO CInt --
112type TM = CInt -> CInt -> PD -> IO CInt --
113
114--------------------------------------------------------------------------------
115
116{- | obtains the number of rows and columns in an ASCII data file
117 (provisionally using unix's wc).
118-}
119fileDimensions :: FilePath -> IO (Int,Int)
120fileDimensions fname = do
121 wcres <- readProcess "wc" ["-w",fname] ""
122 contents <- readFile fname
123 let tot = read . head . words $ wcres
124 c = length . head . dropWhile null . map words . lines $ contents
125 if tot > 0
126 then return (tot `div` c, c)
127 else return (0,0)
128
129-- | Loads a matrix from an ASCII file formatted as a 2D table.
130loadMatrix :: FilePath -> IO (Matrix Double)
131loadMatrix file = fromFile file =<< fileDimensions file
132
133-- | Loads a matrix from an ASCII file (the number of rows and columns must be known in advance).
134fromFile :: FilePath -> (Int,Int) -> IO (Matrix Double)
135fromFile filename (r,c) = reshape c `fmap` fscanfVector filename (r*c)
136