module Numeric.GSL.Vector (
FunCodeS(..), toScalarR,
FunCodeV(..), vectorMapR, vectorMapC,
FunCodeSV(..), vectorMapValR, vectorMapValC,
FunCodeVV(..), vectorZipR, vectorZipC
) where
import Data.Packed.Internal.Common
import Data.Packed.Internal.Vector
import Complex
import Foreign
data FunCodeV = Sin
| Cos
| Tan
| Abs
| ASin
| ACos
| ATan
| Sinh
| Cosh
| Tanh
| ASinh
| ACosh
| ATanh
| Exp
| Log
| Sign
| Sqrt
deriving Enum
data FunCodeSV = Scale
| Recip
| AddConstant
| Negate
| PowSV
| PowVS
deriving Enum
data FunCodeVV = Add
| Sub
| Mul
| Div
| Pow
| ATan2
deriving Enum
data FunCodeS = Norm2
| AbsSum
| MaxIdx
| Max
| MinIdx
| Min
deriving Enum
toScalarAux fun code v = unsafePerformIO $ do
r <- createVector 1
app2 (fun (fromEnum code)) vec v vec r "toScalarAux"
return (r `at` 0)
vectorMapAux fun code v = unsafePerformIO $ do
r <- createVector (dim v)
app2 (fun (fromEnum code)) vec v vec r "vectorMapAux"
return r
vectorMapValAux fun code val v = unsafePerformIO $ do
r <- createVector (dim v)
pval <- newArray [val]
app2 (fun (fromEnum code) pval) vec v vec r "vectorMapValAux"
free pval
return r
vectorZipAux fun code u v = unsafePerformIO $ do
r <- createVector (dim u)
app3 (fun (fromEnum code)) vec u vec v vec r "vectorZipAux"
return r
toScalarR :: FunCodeS -> Vector Double -> Double
toScalarR oper = toScalarAux c_toScalarR (fromEnum oper)
foreign import ccall safe "gsl-aux.h toScalarR" c_toScalarR :: Int -> TVV
vectorMapR :: FunCodeV -> Vector Double -> Vector Double
vectorMapR = vectorMapAux c_vectorMapR
foreign import ccall safe "gsl-aux.h mapR" c_vectorMapR :: Int -> TVV
vectorMapC :: FunCodeV -> Vector (Complex Double) -> Vector (Complex Double)
vectorMapC oper = vectorMapAux c_vectorMapC (fromEnum oper)
foreign import ccall safe "gsl-aux.h mapC" c_vectorMapC :: Int -> TCVCV
vectorMapValR :: FunCodeSV -> Double -> Vector Double -> Vector Double
vectorMapValR oper = vectorMapValAux c_vectorMapValR (fromEnum oper)
foreign import ccall safe "gsl-aux.h mapValR" c_vectorMapValR :: Int -> Ptr Double -> TVV
vectorMapValC :: FunCodeSV -> Complex Double -> Vector (Complex Double) -> Vector (Complex Double)
vectorMapValC = vectorMapValAux c_vectorMapValC
foreign import ccall safe "gsl-aux.h mapValC" c_vectorMapValC :: Int -> Ptr (Complex Double) -> TCVCV
vectorZipR :: FunCodeVV -> Vector Double -> Vector Double -> Vector Double
vectorZipR = vectorZipAux c_vectorZipR
foreign import ccall safe "gsl-aux.h zipR" c_vectorZipR :: Int -> TVVV
vectorZipC :: FunCodeVV -> Vector (Complex Double) -> Vector (Complex Double) -> Vector (Complex Double)
vectorZipC = vectorZipAux c_vectorZipC
foreign import ccall safe "gsl-aux.h zipC" c_vectorZipC :: Int -> TCVCVCV