summaryrefslogtreecommitdiff
path: root/lib/Numeric
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Numeric')
-rw-r--r--lib/Numeric/GSL/Differentiation.hs2
-rw-r--r--lib/Numeric/GSL/Matrix.hs24
-rw-r--r--lib/Numeric/GSL/Minimization.hs27
-rw-r--r--lib/Numeric/GSL/Special.hs2
-rw-r--r--lib/Numeric/LinearAlgebra.hs2
-rw-r--r--lib/Numeric/LinearAlgebra/Algorithms.hs29
-rw-r--r--lib/Numeric/LinearAlgebra/LAPACK.hs3
-rw-r--r--lib/Numeric/LinearAlgebra/Linear.hs2
8 files changed, 45 insertions, 46 deletions
diff --git a/lib/Numeric/GSL/Differentiation.hs b/lib/Numeric/GSL/Differentiation.hs
index 09236bd..071704a 100644
--- a/lib/Numeric/GSL/Differentiation.hs
+++ b/lib/Numeric/GSL/Differentiation.hs
@@ -34,7 +34,7 @@ derivGen ::
34derivGen c h f x = unsafePerformIO $ do 34derivGen c h f x = unsafePerformIO $ do
35 r <- malloc 35 r <- malloc
36 e <- malloc 36 e <- malloc
37 fp <- mkfun (\x _ -> f x) 37 fp <- mkfun (\y _ -> f y)
38 c_deriv c fp x h r e // check "deriv" 38 c_deriv c fp x h r e // check "deriv"
39 vr <- peek r 39 vr <- peek r
40 ve <- peek e 40 ve <- peek e
diff --git a/lib/Numeric/GSL/Matrix.hs b/lib/Numeric/GSL/Matrix.hs
index 07d4660..d51728e 100644
--- a/lib/Numeric/GSL/Matrix.hs
+++ b/lib/Numeric/GSL/Matrix.hs
@@ -17,13 +17,13 @@ module Numeric.GSL.Matrix(
17 eigSg, eigHg, 17 eigSg, eigHg,
18 svdg, 18 svdg,
19 qr, qrPacked, unpackQR, 19 qr, qrPacked, unpackQR,
20 cholR, -- cholC, 20 cholR, cholC,
21 luSolveR, luSolveC, 21 luSolveR, luSolveC,
22 luR, luC 22 luR, luC
23) where 23) where
24 24
25import Data.Packed.Internal 25import Data.Packed.Internal
26import Data.Packed.Matrix(fromLists,ident,takeDiag) 26import Data.Packed.Matrix(ident)
27import Numeric.GSL.Vector 27import Numeric.GSL.Vector
28import Foreign 28import Foreign
29import Complex 29import Complex
@@ -44,7 +44,7 @@ import Complex
44 44
45-} 45-}
46eigSg :: Matrix Double -> (Vector Double, Matrix Double) 46eigSg :: Matrix Double -> (Vector Double, Matrix Double)
47eigSg = eigSg . cmat 47eigSg = eigSg' . cmat
48 48
49eigSg' m 49eigSg' m
50 | r == 1 = (fromList [cdat m `at` 0], singleton 1) 50 | r == 1 = (fromList [cdat m `at` 0], singleton 1)
@@ -159,24 +159,24 @@ qrPacked :: Matrix Double -> (Matrix Double, Vector Double)
159qrPacked = qrPacked' . cmat 159qrPacked = qrPacked' . cmat
160 160
161qrPacked' x = unsafePerformIO $ do 161qrPacked' x = unsafePerformIO $ do
162 qr <- createMatrix RowMajor r c 162 qrp <- createMatrix RowMajor r c
163 tau <- createVector (min r c) 163 tau <- createVector (min r c)
164 app3 c_qrPacked mat x mat qr vec tau "qrUnpacked" 164 app3 c_qrPacked mat x mat qrp vec tau "qrUnpacked"
165 return (qr,tau) 165 return (qrp,tau)
166 where r = rows x 166 where r = rows x
167 c = cols x 167 c = cols x
168foreign import ccall "gsl-aux.h QRpacked" c_qrPacked :: TMMV 168foreign import ccall "gsl-aux.h QRpacked" c_qrPacked :: TMMV
169 169
170unpackQR :: (Matrix Double, Vector Double) -> (Matrix Double, Matrix Double) 170unpackQR :: (Matrix Double, Vector Double) -> (Matrix Double, Matrix Double)
171unpackQR (qr,tau) = unpackQR' (cmat qr, tau) 171unpackQR (qrp,tau) = unpackQR' (cmat qrp, tau)
172 172
173unpackQR' (qr,tau) = unsafePerformIO $ do 173unpackQR' (qrp,tau) = unsafePerformIO $ do
174 q <- createMatrix RowMajor r r 174 q <- createMatrix RowMajor r r
175 res <- createMatrix RowMajor r c 175 res <- createMatrix RowMajor r c
176 app4 c_qrUnpack mat qr vec tau mat q mat res "qrUnpack" 176 app4 c_qrUnpack mat qrp vec tau mat q mat res "qrUnpack"
177 return (q,res) 177 return (q,res)
178 where r = rows qr 178 where r = rows qrp
179 c = cols qr 179 c = cols qrp
180foreign import ccall "gsl-aux.h QRunpack" c_qrUnpack :: TMVMM 180foreign import ccall "gsl-aux.h QRunpack" c_qrUnpack :: TMVMM
181 181
182 182
@@ -259,7 +259,6 @@ luRaux' x = unsafePerformIO $ do
259 app2 c_luRaux mat x vec res "luRaux" 259 app2 c_luRaux mat x vec res "luRaux"
260 return res 260 return res
261 where r = rows x 261 where r = rows x
262 c = cols x
263foreign import ccall "gsl-aux.h luRaux" c_luRaux :: TMV 262foreign import ccall "gsl-aux.h luRaux" c_luRaux :: TMV
264 263
265{- | lu decomposition of complex matrix (packed as a vector including l, u, the permutation and sign) 264{- | lu decomposition of complex matrix (packed as a vector including l, u, the permutation and sign)
@@ -272,7 +271,6 @@ luCaux' x = unsafePerformIO $ do
272 app2 c_luCaux mat x vec res "luCaux" 271 app2 c_luCaux mat x vec res "luCaux"
273 return res 272 return res
274 where r = rows x 273 where r = rows x
275 c = cols x
276foreign import ccall "gsl-aux.h luCaux" c_luCaux :: TCMCV 274foreign import ccall "gsl-aux.h luCaux" c_luCaux :: TCMCV
277 275
278{- | The LU decomposition of a square matrix. Is based on /gsl_linalg_LU_decomp/ and /gsl_linalg_complex_LU_decomp/ as described in <http://www.gnu.org/software/Numeric.GSL/manual/Numeric.GSL-ref_13.html#SEC223>. 276{- | The LU decomposition of a square matrix. Is based on /gsl_linalg_LU_decomp/ and /gsl_linalg_complex_LU_decomp/ as described in <http://www.gnu.org/software/Numeric.GSL/manual/Numeric.GSL-ref_13.html#SEC223>.
diff --git a/lib/Numeric/GSL/Minimization.hs b/lib/Numeric/GSL/Minimization.hs
index 235a88f..98c0ca9 100644
--- a/lib/Numeric/GSL/Minimization.hs
+++ b/lib/Numeric/GSL/Minimization.hs
@@ -24,7 +24,6 @@ module Numeric.GSL.Minimization (
24import Data.Packed.Internal 24import Data.Packed.Internal
25import Data.Packed.Matrix 25import Data.Packed.Matrix
26import Foreign 26import Foreign
27import Complex
28 27
29------------------------------------------------------------------------- 28-------------------------------------------------------------------------
30 29
@@ -84,9 +83,9 @@ minimizeNMSimplex f xi sz tol maxit = unsafePerformIO $ do
84 szv = fromList sz 83 szv = fromList sz
85 n = dim xiv 84 n = dim xiv
86 fp <- mkVecfun (iv (f.toList)) 85 fp <- mkVecfun (iv (f.toList))
87 rawpath <- ww2 withVector xiv withVector szv $ \xiv szv -> 86 rawpath <- ww2 withVector xiv withVector szv $ \xiv' szv' ->
88 createMIO maxit (n+3) 87 createMIO maxit (n+3)
89 (c_minimizeNMSimplex fp tol maxit // xiv // szv) 88 (c_minimizeNMSimplex fp tol maxit // xiv' // szv')
90 "minimizeNMSimplex" 89 "minimizeNMSimplex"
91 let it = round (rawpath @@> (maxit-1,0)) 90 let it = round (rawpath @@> (maxit-1,0))
92 path = takeRows it rawpath 91 path = takeRows it rawpath
@@ -150,9 +149,9 @@ minimizeConjugateGradient istep minimpar tol maxit f df xi = unsafePerformIO $ d
150 df' = (fromList . df . toList) 149 df' = (fromList . df . toList)
151 fp <- mkVecfun (iv f') 150 fp <- mkVecfun (iv f')
152 dfp <- mkVecVecfun (aux_vTov df') 151 dfp <- mkVecVecfun (aux_vTov df')
153 rawpath <- withVector xiv $ \xiv -> 152 rawpath <- withVector xiv $ \xiv' ->
154 createMIO maxit (n+2) 153 createMIO maxit (n+2)
155 (c_minimizeConjugateGradient fp dfp istep minimpar tol maxit // xiv) 154 (c_minimizeConjugateGradient fp dfp istep minimpar tol maxit // xiv')
156 "minimizeDerivV" 155 "minimizeDerivV"
157 let it = round (rawpath @@> (maxit-1,0)) 156 let it = round (rawpath @@> (maxit-1,0))
158 path = takeRows it rawpath 157 path = takeRows it rawpath
@@ -171,8 +170,8 @@ foreign import ccall "gsl-aux.h minimizeWithDeriv"
171--------------------------------------------------------------------- 170---------------------------------------------------------------------
172iv :: (Vector Double -> Double) -> (Int -> Ptr Double -> Double) 171iv :: (Vector Double -> Double) -> (Int -> Ptr Double -> Double)
173iv f n p = f (createV n copy "iv") where 172iv f n p = f (createV n copy "iv") where
174 copy n q = do 173 copy n' q = do
175 copyArray q p n 174 copyArray q p n'
176 return 0 175 return 0
177 176
178-- | conversion of Haskell functions into function pointers that can be used in the C side 177-- | conversion of Haskell functions into function pointers that can be used in the C side
@@ -187,12 +186,12 @@ foreign import ccall "wrapper"
187 186
188aux_vTov :: (Vector Double -> Vector Double) -> (Int -> Ptr Double -> Ptr Double -> IO()) 187aux_vTov :: (Vector Double -> Vector Double) -> (Int -> Ptr Double -> Ptr Double -> IO())
189aux_vTov f n p r = g where 188aux_vTov f n p r = g where
190 v@V {fptr = pr} = f x 189 V {fptr = pr} = f x
191 x = createV n copy "aux_vTov" 190 x = createV n copy "aux_vTov"
192 copy n q = do 191 copy n' q = do
193 copyArray q p n 192 copyArray q p n'
194 return 0 193 return 0
195 g = withForeignPtr pr $ \p -> copyArray r p n 194 g = withForeignPtr pr $ \p' -> copyArray r p' n
196 195
197-------------------------------------------------------------------- 196--------------------------------------------------------------------
198 197
@@ -202,6 +201,6 @@ createV n fun msg = unsafePerformIO $ do
202 return r 201 return r
203 202
204createMIO r c fun msg = do 203createMIO r c fun msg = do
205 r <- createMatrix RowMajor r c 204 res <- createMatrix RowMajor r c
206 app1 fun mat r msg 205 app1 fun mat res msg
207 return r 206 return res
diff --git a/lib/Numeric/GSL/Special.hs b/lib/Numeric/GSL/Special.hs
index b6cea2b..3fd2ac2 100644
--- a/lib/Numeric/GSL/Special.hs
+++ b/lib/Numeric/GSL/Special.hs
@@ -44,8 +44,6 @@ module Numeric.GSL.Special (
44) 44)
45where 45where
46 46
47import Foreign
48import Numeric.GSL.Special.Internal
49import Numeric.GSL.Special.Airy 47import Numeric.GSL.Special.Airy
50import Numeric.GSL.Special.Bessel 48import Numeric.GSL.Special.Bessel
51import Numeric.GSL.Special.Clausen 49import Numeric.GSL.Special.Clausen
diff --git a/lib/Numeric/LinearAlgebra.hs b/lib/Numeric/LinearAlgebra.hs
index f3190a2..c14d4e4 100644
--- a/lib/Numeric/LinearAlgebra.hs
+++ b/lib/Numeric/LinearAlgebra.hs
@@ -23,5 +23,5 @@ module Numeric.LinearAlgebra (
23import Data.Packed 23import Data.Packed
24import Numeric.LinearAlgebra.Linear 24import Numeric.LinearAlgebra.Linear
25import Numeric.LinearAlgebra.Algorithms 25import Numeric.LinearAlgebra.Algorithms
26import Numeric.LinearAlgebra.Instances 26import Numeric.LinearAlgebra.Instances()
27import Numeric.LinearAlgebra.Interface 27import Numeric.LinearAlgebra.Interface
diff --git a/lib/Numeric/LinearAlgebra/Algorithms.hs b/lib/Numeric/LinearAlgebra/Algorithms.hs
index fd16973..069d9a3 100644
--- a/lib/Numeric/LinearAlgebra/Algorithms.hs
+++ b/lib/Numeric/LinearAlgebra/Algorithms.hs
@@ -165,8 +165,8 @@ pinv m = linearSolveSVD m (ident (rows m))
165-- If @(u,d,v) = full svd m@ then @m == u \<> d \<> trans v@. 165-- If @(u,d,v) = full svd m@ then @m == u \<> d \<> trans v@.
166full :: Element t 166full :: Element t
167 => (Matrix t -> (Matrix t, Vector Double, Matrix t)) -> Matrix t -> (Matrix t, Matrix Double, Matrix t) 167 => (Matrix t -> (Matrix t, Vector Double, Matrix t)) -> Matrix t -> (Matrix t, Matrix Double, Matrix t)
168full svd m = (u, d ,v) where 168full svd' m = (u, d ,v) where
169 (u,s,v) = svd m 169 (u,s,v) = svd' m
170 d = diagRect s r c 170 d = diagRect s r c
171 r = rows m 171 r = rows m
172 c = cols m 172 c = cols m
@@ -176,12 +176,12 @@ full svd m = (u, d ,v) where
176-- If @(u,s,v) = economy svd m@ then @m == u \<> diag s \<> trans v@. 176-- If @(u,s,v) = economy svd m@ then @m == u \<> diag s \<> trans v@.
177economy :: Element t 177economy :: Element t
178 => (Matrix t -> (Matrix t, Vector Double, Matrix t)) -> Matrix t -> (Matrix t, Vector Double, Matrix t) 178 => (Matrix t -> (Matrix t, Vector Double, Matrix t)) -> Matrix t -> (Matrix t, Vector Double, Matrix t)
179economy svd m = (u', subVector 0 d s, v') where 179economy svd' m = (u', subVector 0 d s, v') where
180 (u,s,v) = svd m 180 (u,s,v) = svd' m
181 sl@(g:_) = toList s 181 sl@(g:_) = toList s
182 s' = fromList . filter (>tol) $ sl 182 s' = fromList . filter (>tol) $ sl
183 t = 1 183 t = 1
184 tol = (fromIntegral (max (rows m) (cols m)) * g * t * eps) 184 tol = (fromIntegral (max r c) * g * t * eps)
185 r = rows m 185 r = rows m
186 c = cols m 186 c = cols m
187 d = dim s' 187 d = dim s'
@@ -273,8 +273,8 @@ nullspacePrec t m = ns where
273 (_,s,v) = svd m 273 (_,s,v) = svd m
274 sl@(g:_) = toList s 274 sl@(g:_) = toList s
275 tol = (fromIntegral (max (rows m) (cols m)) * g * t * eps) 275 tol = (fromIntegral (max (rows m) (cols m)) * g * t * eps)
276 rank = length (filter (> g*tol) sl) 276 rank' = length (filter (> g*tol) sl)
277 ns = drop rank $ toRows $ ctrans v 277 ns = drop rank' $ toRows $ ctrans v
278 278
279-- | The nullspace of a matrix, assumed to be one-dimensional, with default tolerance (shortcut for @last . nullspacePrec 1@). 279-- | The nullspace of a matrix, assumed to be one-dimensional, with default tolerance (shortcut for @last . nullspacePrec 1@).
280nullVector :: Field t => Matrix t -> Vector t 280nullVector :: Field t => Matrix t -> Vector t
@@ -306,7 +306,7 @@ pinvTol t m = v' `mXm` diag s' `mXm` trans u' where
306 sl@(g:_) = toList s 306 sl@(g:_) = toList s
307 s' = fromList . map rec $ sl 307 s' = fromList . map rec $ sl
308 rec x = if x < g*tol then 1 else 1/x 308 rec x = if x < g*tol then 1 else 1/x
309 tol = (fromIntegral (max (rows m) (cols m)) * g * t * eps) 309 tol = (fromIntegral (max r c) * g * t * eps)
310 r = rows m 310 r = rows m
311 c = cols m 311 c = cols m
312 d = dim s 312 d = dim s
@@ -368,10 +368,12 @@ rank :: Field t => Matrix t -> Int
368rank m | pnorm PNorm1 m < eps = 0 368rank m | pnorm PNorm1 m < eps = 0
369 | otherwise = dim s where (_,s,_) = economy svd m 369 | otherwise = dim s where (_,s,_) = economy svd m
370 370
371{-
371expm' m = case diagonalize (complex m) of 372expm' m = case diagonalize (complex m) of
372 Just (l,v) -> v `mXm` diag (exp l) `mXm` inv v 373 Just (l,v) -> v `mXm` diag (exp l) `mXm` inv v
373 Nothing -> error "Sorry, expm not yet implemented for non-diagonalizable matrices" 374 Nothing -> error "Sorry, expm not yet implemented for non-diagonalizable matrices"
374 where exp = vectorMapC Exp 375 where exp = vectorMapC Exp
376-}
375 377
376diagonalize m = if rank v == n 378diagonalize m = if rank v == n
377 then Just (l,v) 379 then Just (l,v)
@@ -406,7 +408,7 @@ geps delta = head [ k | (k,g) <- epslist, g<delta]
406expGolub m = iterate msq f !! j 408expGolub m = iterate msq f !! j
407 where j = max 0 $ floor $ log2 $ pnorm Infinity m 409 where j = max 0 $ floor $ log2 $ pnorm Infinity m
408 log2 x = log x / log 2 410 log2 x = log x / log 2
409 a = m */ fromIntegral (2^j) 411 a = m */ fromIntegral ((2::Int)^j)
410 q = geps eps -- 7 steps 412 q = geps eps -- 7 steps
411 eye = ident (rows m) 413 eye = ident (rows m)
412 work (k,c,x,n,d) = (k',c',x',n',d') 414 work (k,c,x,n,d) = (k',c',x',n',d')
@@ -415,9 +417,9 @@ expGolub m = iterate msq f !! j
415 x' = a <> x 417 x' = a <> x
416 n' = n |+| (c' .* x') 418 n' = n |+| (c' .* x')
417 d' = d |+| (((-1)^k * c') .* x') 419 d' = d |+| (((-1)^k * c') .* x')
418 (_,_,_,n,d) = iterate work (1,1,eye,eye,eye) !! q 420 (_,_,_,nf,df) = iterate work (1,1,eye,eye,eye) !! q
419 f = linearSolve d n 421 f = linearSolve df nf
420 msq m = m <> m 422 msq x = x <> x
421 423
422 (<>) = multiply 424 (<>) = multiply
423 v */ x = scale (recip x) v 425 v */ x = scale (recip x) v
@@ -446,9 +448,10 @@ It only works with invertible matrices that have a real solution. For diagonaliz
446sqrtm :: Field t => Matrix t -> Matrix t 448sqrtm :: Field t => Matrix t -> Matrix t
447sqrtm = sqrtmInv 449sqrtm = sqrtmInv
448 450
449sqrtmInv a = fst $ fixedPoint $ iterate f (a, ident (rows a)) 451sqrtmInv x = fst $ fixedPoint $ iterate f (x, ident (rows x))
450 where fixedPoint (a:b:rest) | pnorm PNorm1 (fst a |-| fst b) < eps = a 452 where fixedPoint (a:b:rest) | pnorm PNorm1 (fst a |-| fst b) < eps = a
451 | otherwise = fixedPoint (b:rest) 453 | otherwise = fixedPoint (b:rest)
454 fixedPoint _ = error "fixedpoint with impossible inputs"
452 f (y,z) = (0.5 .* (y |+| inv z), 455 f (y,z) = (0.5 .* (y |+| inv z),
453 0.5 .* (inv y |+| z)) 456 0.5 .* (inv y |+| z))
454 (.*) = scale 457 (.*) = scale
diff --git a/lib/Numeric/LinearAlgebra/LAPACK.hs b/lib/Numeric/LinearAlgebra/LAPACK.hs
index 936cb19..cacad87 100644
--- a/lib/Numeric/LinearAlgebra/LAPACK.hs
+++ b/lib/Numeric/LinearAlgebra/LAPACK.hs
@@ -120,11 +120,12 @@ eigRaux m
120 where r = rows m 120 where r = rows m
121 121
122fixeig [] _ = [] 122fixeig [] _ = []
123fixeig [r] [v] = [comp v] 123fixeig [_] [v] = [comp v]
124fixeig ((r1:+i1):(r2:+i2):r) (v1:v2:vs) 124fixeig ((r1:+i1):(r2:+i2):r) (v1:v2:vs)
125 | r1 == r2 && i1 == (-i2) = toComplex (v1,v2) : toComplex (v1,scale (-1) v2) : fixeig r vs 125 | r1 == r2 && i1 == (-i2) = toComplex (v1,v2) : toComplex (v1,scale (-1) v2) : fixeig r vs
126 | otherwise = comp v1 : fixeig ((r2:+i2):r) (v2:vs) 126 | otherwise = comp v1 : fixeig ((r2:+i2):r) (v2:vs)
127 where scale = vectorMapValR Scale 127 where scale = vectorMapValR Scale
128fixeig _ _ = error "fixeig with impossible inputs"
128 129
129----------------------------------------------------------------------------- 130-----------------------------------------------------------------------------
130 131
diff --git a/lib/Numeric/LinearAlgebra/Linear.hs b/lib/Numeric/LinearAlgebra/Linear.hs
index 3403591..a39df50 100644
--- a/lib/Numeric/LinearAlgebra/Linear.hs
+++ b/lib/Numeric/LinearAlgebra/Linear.hs
@@ -20,7 +20,7 @@ module Numeric.LinearAlgebra.Linear (
20) where 20) where
21 21
22 22
23import Data.Packed.Internal(multiply,at,partit) 23import Data.Packed.Internal(multiply,partit)
24import Data.Packed 24import Data.Packed
25import Numeric.GSL.Vector 25import Numeric.GSL.Vector
26import Complex 26import Complex