{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
module Numeric.GSL.Integration (
integrateQNG,
integrateQAGS,
integrateQAGI,
integrateQAGIU,
integrateQAGIL,
integrateCQUAD
) where
import Foreign.C.Types
import Foreign.Marshal.Alloc(malloc, free)
import Foreign.Ptr(Ptr, FunPtr, freeHaskellFunPtr)
import Foreign.Storable(peek)
import Numeric.GSL.Internal
import System.IO.Unsafe(unsafePerformIO)
eps :: Double
eps = 1e-12
foreign import ccall safe "wrapper" mkfun:: (Double -> Ptr() -> Double) -> IO( FunPtr (Double -> Ptr() -> Double))
integrateQAGS :: Double
-> Int
-> (Double -> Double)
-> Double
-> Double
-> (Double, Double)
integrateQAGS :: Double
-> Int
-> (Double -> Double)
-> Double
-> Double
-> (Double, Double)
integrateQAGS prec :: Double
prec n :: Int
n f :: Double -> Double
f a :: Double
a b :: Double
b = IO (Double, Double) -> (Double, Double)
forall a. IO a -> a
unsafePerformIO (IO (Double, Double) -> (Double, Double))
-> IO (Double, Double) -> (Double, Double)
forall a b. (a -> b) -> a -> b
$ do
Ptr Double
r <- IO (Ptr Double)
forall a. Storable a => IO (Ptr a)
malloc
Ptr Double
e <- IO (Ptr Double)
forall a. Storable a => IO (Ptr a)
malloc
FunPtr (Double -> Ptr () -> Double)
fp <- (Double -> Ptr () -> Double)
-> IO (FunPtr (Double -> Ptr () -> Double))
mkfun (\x :: Double
x _ -> Double -> Double
f Double
x)
FunPtr (Double -> Ptr () -> Double)
-> Double
-> Double
-> Double
-> Double
-> CInt
-> Ptr Double
-> Ptr Double
-> IO CInt
c_integrate_qags FunPtr (Double -> Ptr () -> Double)
fp Double
a Double
b Double
eps Double
prec (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n) Ptr Double
r Ptr Double
e IO CInt -> (IO CInt -> IO ()) -> IO ()
forall x y. x -> (x -> y) -> y
// String -> IO CInt -> IO ()
check "integrate_qags"
Double
vr <- Ptr Double -> IO Double
forall a. Storable a => Ptr a -> IO a
peek Ptr Double
r
Double
ve <- Ptr Double -> IO Double
forall a. Storable a => Ptr a -> IO a
peek Ptr Double
e
let result :: (Double, Double)
result = (Double
vr,Double
ve)
Ptr Double -> IO ()
forall a. Ptr a -> IO ()
free Ptr Double
r
Ptr Double -> IO ()
forall a. Ptr a -> IO ()
free Ptr Double
e
FunPtr (Double -> Ptr () -> Double) -> IO ()
forall a. FunPtr a -> IO ()
freeHaskellFunPtr FunPtr (Double -> Ptr () -> Double)
fp
(Double, Double) -> IO (Double, Double)
forall (m :: * -> *) a. Monad m => a -> m a
return (Double, Double)
result
foreign import ccall safe "integrate_qags" c_integrate_qags
:: FunPtr (Double-> Ptr() -> Double) -> Double -> Double
-> Double -> Double -> CInt -> Ptr Double -> Ptr Double -> IO CInt
integrateQNG :: Double
-> (Double -> Double)
-> Double
-> Double
-> (Double, Double)
integrateQNG :: Double
-> (Double -> Double) -> Double -> Double -> (Double, Double)
integrateQNG prec :: Double
prec f :: Double -> Double
f a :: Double
a b :: Double
b = IO (Double, Double) -> (Double, Double)
forall a. IO a -> a
unsafePerformIO (IO (Double, Double) -> (Double, Double))
-> IO (Double, Double) -> (Double, Double)
forall a b. (a -> b) -> a -> b
$ do
Ptr Double
r <- IO (Ptr Double)
forall a. Storable a => IO (Ptr a)
malloc
Ptr Double
e <- IO (Ptr Double)
forall a. Storable a => IO (Ptr a)
malloc
FunPtr (Double -> Ptr () -> Double)
fp <- (Double -> Ptr () -> Double)
-> IO (FunPtr (Double -> Ptr () -> Double))
mkfun (\x :: Double
x _ -> Double -> Double
f Double
x)
FunPtr (Double -> Ptr () -> Double)
-> Double
-> Double
-> Double
-> Double
-> Ptr Double
-> Ptr Double
-> IO CInt
c_integrate_qng FunPtr (Double -> Ptr () -> Double)
fp Double
a Double
b Double
eps Double
prec Ptr Double
r Ptr Double
e IO CInt -> (IO CInt -> IO ()) -> IO ()
forall x y. x -> (x -> y) -> y
// String -> IO CInt -> IO ()
check "integrate_qng"
Double
vr <- Ptr Double -> IO Double
forall a. Storable a => Ptr a -> IO a
peek Ptr Double
r
Double
ve <- Ptr Double -> IO Double
forall a. Storable a => Ptr a -> IO a
peek Ptr Double
e
let result :: (Double, Double)
result = (Double
vr,Double
ve)
Ptr Double -> IO ()
forall a. Ptr a -> IO ()
free Ptr Double
r
Ptr Double -> IO ()
forall a. Ptr a -> IO ()
free Ptr Double
e
FunPtr (Double -> Ptr () -> Double) -> IO ()
forall a. FunPtr a -> IO ()
freeHaskellFunPtr FunPtr (Double -> Ptr () -> Double)
fp
(Double, Double) -> IO (Double, Double)
forall (m :: * -> *) a. Monad m => a -> m a
return (Double, Double)
result
foreign import ccall safe "integrate_qng" c_integrate_qng
:: FunPtr (Double-> Ptr() -> Double) -> Double -> Double
-> Double -> Double -> Ptr Double -> Ptr Double -> IO CInt
integrateQAGI :: Double
-> Int
-> (Double -> Double)
-> (Double, Double)
integrateQAGI :: Double -> Int -> (Double -> Double) -> (Double, Double)
integrateQAGI prec :: Double
prec n :: Int
n f :: Double -> Double
f = IO (Double, Double) -> (Double, Double)
forall a. IO a -> a
unsafePerformIO (IO (Double, Double) -> (Double, Double))
-> IO (Double, Double) -> (Double, Double)
forall a b. (a -> b) -> a -> b
$ do
Ptr Double
r <- IO (Ptr Double)
forall a. Storable a => IO (Ptr a)
malloc
Ptr Double
e <- IO (Ptr Double)
forall a. Storable a => IO (Ptr a)
malloc
FunPtr (Double -> Ptr () -> Double)
fp <- (Double -> Ptr () -> Double)
-> IO (FunPtr (Double -> Ptr () -> Double))
mkfun (\x :: Double
x _ -> Double -> Double
f Double
x)
FunPtr (Double -> Ptr () -> Double)
-> Double -> Double -> CInt -> Ptr Double -> Ptr Double -> IO CInt
c_integrate_qagi FunPtr (Double -> Ptr () -> Double)
fp Double
eps Double
prec (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n) Ptr Double
r Ptr Double
e IO CInt -> (IO CInt -> IO ()) -> IO ()
forall x y. x -> (x -> y) -> y
// String -> IO CInt -> IO ()
check "integrate_qagi"
Double
vr <- Ptr Double -> IO Double
forall a. Storable a => Ptr a -> IO a
peek Ptr Double
r
Double
ve <- Ptr Double -> IO Double
forall a. Storable a => Ptr a -> IO a
peek Ptr Double
e
let result :: (Double, Double)
result = (Double
vr,Double
ve)
Ptr Double -> IO ()
forall a. Ptr a -> IO ()
free Ptr Double
r
Ptr Double -> IO ()
forall a. Ptr a -> IO ()
free Ptr Double
e
FunPtr (Double -> Ptr () -> Double) -> IO ()
forall a. FunPtr a -> IO ()
freeHaskellFunPtr FunPtr (Double -> Ptr () -> Double)
fp
(Double, Double) -> IO (Double, Double)
forall (m :: * -> *) a. Monad m => a -> m a
return (Double, Double)
result
foreign import ccall safe "integrate_qagi" c_integrate_qagi
:: FunPtr (Double-> Ptr() -> Double) -> Double -> Double
-> CInt -> Ptr Double -> Ptr Double -> IO CInt
integrateQAGIU :: Double
-> Int
-> (Double -> Double)
-> Double
-> (Double, Double)
integrateQAGIU :: Double -> Int -> (Double -> Double) -> Double -> (Double, Double)
integrateQAGIU prec :: Double
prec n :: Int
n f :: Double -> Double
f a :: Double
a = IO (Double, Double) -> (Double, Double)
forall a. IO a -> a
unsafePerformIO (IO (Double, Double) -> (Double, Double))
-> IO (Double, Double) -> (Double, Double)
forall a b. (a -> b) -> a -> b
$ do
Ptr Double
r <- IO (Ptr Double)
forall a. Storable a => IO (Ptr a)
malloc
Ptr Double
e <- IO (Ptr Double)
forall a. Storable a => IO (Ptr a)
malloc
FunPtr (Double -> Ptr () -> Double)
fp <- (Double -> Ptr () -> Double)
-> IO (FunPtr (Double -> Ptr () -> Double))
mkfun (\x :: Double
x _ -> Double -> Double
f Double
x)
FunPtr (Double -> Ptr () -> Double)
-> Double
-> Double
-> Double
-> CInt
-> Ptr Double
-> Ptr Double
-> IO CInt
c_integrate_qagiu FunPtr (Double -> Ptr () -> Double)
fp Double
a Double
eps Double
prec (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n) Ptr Double
r Ptr Double
e IO CInt -> (IO CInt -> IO ()) -> IO ()
forall x y. x -> (x -> y) -> y
// String -> IO CInt -> IO ()
check "integrate_qagiu"
Double
vr <- Ptr Double -> IO Double
forall a. Storable a => Ptr a -> IO a
peek Ptr Double
r
Double
ve <- Ptr Double -> IO Double
forall a. Storable a => Ptr a -> IO a
peek Ptr Double
e
let result :: (Double, Double)
result = (Double
vr,Double
ve)
Ptr Double -> IO ()
forall a. Ptr a -> IO ()
free Ptr Double
r
Ptr Double -> IO ()
forall a. Ptr a -> IO ()
free Ptr Double
e
FunPtr (Double -> Ptr () -> Double) -> IO ()
forall a. FunPtr a -> IO ()
freeHaskellFunPtr FunPtr (Double -> Ptr () -> Double)
fp
(Double, Double) -> IO (Double, Double)
forall (m :: * -> *) a. Monad m => a -> m a
return (Double, Double)
result
foreign import ccall safe "integrate_qagiu" c_integrate_qagiu
:: FunPtr (Double-> Ptr() -> Double) -> Double -> Double
-> Double -> CInt -> Ptr Double -> Ptr Double -> IO CInt
integrateQAGIL :: Double
-> Int
-> (Double -> Double)
-> Double
-> (Double, Double)
integrateQAGIL :: Double -> Int -> (Double -> Double) -> Double -> (Double, Double)
integrateQAGIL prec :: Double
prec n :: Int
n f :: Double -> Double
f b :: Double
b = IO (Double, Double) -> (Double, Double)
forall a. IO a -> a
unsafePerformIO (IO (Double, Double) -> (Double, Double))
-> IO (Double, Double) -> (Double, Double)
forall a b. (a -> b) -> a -> b
$ do
Ptr Double
r <- IO (Ptr Double)
forall a. Storable a => IO (Ptr a)
malloc
Ptr Double
e <- IO (Ptr Double)
forall a. Storable a => IO (Ptr a)
malloc
FunPtr (Double -> Ptr () -> Double)
fp <- (Double -> Ptr () -> Double)
-> IO (FunPtr (Double -> Ptr () -> Double))
mkfun (\x :: Double
x _ -> Double -> Double
f Double
x)
FunPtr (Double -> Ptr () -> Double)
-> Double
-> Double
-> Double
-> CInt
-> Ptr Double
-> Ptr Double
-> IO CInt
c_integrate_qagil FunPtr (Double -> Ptr () -> Double)
fp Double
b Double
eps Double
prec (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n) Ptr Double
r Ptr Double
e IO CInt -> (IO CInt -> IO ()) -> IO ()
forall x y. x -> (x -> y) -> y
// String -> IO CInt -> IO ()
check "integrate_qagil"
Double
vr <- Ptr Double -> IO Double
forall a. Storable a => Ptr a -> IO a
peek Ptr Double
r
Double
ve <- Ptr Double -> IO Double
forall a. Storable a => Ptr a -> IO a
peek Ptr Double
e
let result :: (Double, Double)
result = (Double
vr,Double
ve)
Ptr Double -> IO ()
forall a. Ptr a -> IO ()
free Ptr Double
r
Ptr Double -> IO ()
forall a. Ptr a -> IO ()
free Ptr Double
e
FunPtr (Double -> Ptr () -> Double) -> IO ()
forall a. FunPtr a -> IO ()
freeHaskellFunPtr FunPtr (Double -> Ptr () -> Double)
fp
(Double, Double) -> IO (Double, Double)
forall (m :: * -> *) a. Monad m => a -> m a
return (Double, Double)
result
foreign import ccall safe "gsl-aux.h integrate_qagil" c_integrate_qagil
:: FunPtr (Double-> Ptr() -> Double) -> Double -> Double
-> Double -> CInt -> Ptr Double -> Ptr Double -> IO CInt
integrateCQUAD :: Double
-> Int
-> (Double -> Double)
-> Double
-> Double
-> (Double, Double, Int)
integrateCQUAD :: Double
-> Int
-> (Double -> Double)
-> Double
-> Double
-> (Double, Double, Int)
integrateCQUAD prec :: Double
prec n :: Int
n f :: Double -> Double
f a :: Double
a b :: Double
b = IO (Double, Double, Int) -> (Double, Double, Int)
forall a. IO a -> a
unsafePerformIO (IO (Double, Double, Int) -> (Double, Double, Int))
-> IO (Double, Double, Int) -> (Double, Double, Int)
forall a b. (a -> b) -> a -> b
$ do
Ptr Double
r <- IO (Ptr Double)
forall a. Storable a => IO (Ptr a)
malloc
Ptr Double
e <- IO (Ptr Double)
forall a. Storable a => IO (Ptr a)
malloc
Ptr Int
neval <- IO (Ptr Int)
forall a. Storable a => IO (Ptr a)
malloc
FunPtr (Double -> Ptr () -> Double)
fp <- (Double -> Ptr () -> Double)
-> IO (FunPtr (Double -> Ptr () -> Double))
mkfun (\x :: Double
x _ -> Double -> Double
f Double
x)
FunPtr (Double -> Ptr () -> Double)
-> Double
-> Double
-> Double
-> Double
-> CInt
-> Ptr Double
-> Ptr Double
-> Ptr Int
-> IO CInt
c_integrate_cquad FunPtr (Double -> Ptr () -> Double)
fp Double
a Double
b Double
eps Double
prec (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n) Ptr Double
r Ptr Double
e Ptr Int
neval IO CInt -> (IO CInt -> IO ()) -> IO ()
forall x y. x -> (x -> y) -> y
// String -> IO CInt -> IO ()
check "integrate_cquad"
Double
vr <- Ptr Double -> IO Double
forall a. Storable a => Ptr a -> IO a
peek Ptr Double
r
Double
ve <- Ptr Double -> IO Double
forall a. Storable a => Ptr a -> IO a
peek Ptr Double
e
Int
vneval <- Ptr Int -> IO Int
forall a. Storable a => Ptr a -> IO a
peek Ptr Int
neval
let result :: (Double, Double, Int)
result = (Double
vr,Double
ve,Int
vneval)
Ptr Double -> IO ()
forall a. Ptr a -> IO ()
free Ptr Double
r
Ptr Double -> IO ()
forall a. Ptr a -> IO ()
free Ptr Double
e
Ptr Int -> IO ()
forall a. Ptr a -> IO ()
free Ptr Int
neval
FunPtr (Double -> Ptr () -> Double) -> IO ()
forall a. FunPtr a -> IO ()
freeHaskellFunPtr FunPtr (Double -> Ptr () -> Double)
fp
(Double, Double, Int) -> IO (Double, Double, Int)
forall (m :: * -> *) a. Monad m => a -> m a
return (Double, Double, Int)
result
foreign import ccall safe "integrate_cquad" c_integrate_cquad
:: FunPtr (Double-> Ptr() -> Double) -> Double -> Double
-> Double -> Double -> CInt -> Ptr Double -> Ptr Double -> Ptr Int -> IO CInt